LOW_VALUE и HIGH_VALUE в USER_TAB_COLUMNS - PullRequest
       12

LOW_VALUE и HIGH_VALUE в USER_TAB_COLUMNS

5 голосов
/ 04 января 2012

У меня есть вопрос, касающийся столбцов LOW_VALUE и HIGH_VALUE в представлении USER_TAB_COLUMNS (или эквивалент).

Мне просто интересно, всегда ли эти значения правильны, например, если у вас есть столбец с 500k строксо значением 1, 500 тыс. строк со значением 5 и 1 строкой со значением 1000, LOW_VALUE должно быть 1 (после преобразования необработанного рисунка) и HIGH_VALUE должно быть 1000 (после преобразования необработанного рисунка).Однако существуют ли обстоятельства, когда Oracle «пропустит» это значение выброса и вместо этого будет иметь 5 для HIGH_VALUE?

Кроме того, какова цель этих 2 значений?

Спасибо

1 Ответ

6 голосов
/ 04 января 2012

Как и для всей статистики, относящейся к оптимизатору, эти значения являются оценками с различной степенью точности с момента сбора статистики в таблице. Таким образом, вполне ожидаемо, что они будут близки, но не совсем точны, и вполне возможно, что они будут совершенно неверными.

Когда вы собираете статистику, вы указываете процент строк (или блоков), которые должны быть выбраны. Можно указать размер выборки 100%, и в этом случае Oracle будет проверять каждую строку, но относительно редко запрашивается размер выборки, почти такой большой. Гораздо эффективнее запрашивать гораздо меньший размер выборки (либо явно, либо позволяя Oracle автоматически определять размер выборки). Если ваша выборка строк не содержит одну строку со значением 1000, HIGH_VALUE не будет 1000, HIGH_VALUE будет 5, если предположить, что это наибольшее значение, которое видел образец.

Статистика также является моментальным снимком. По умолчанию 11g будет собирать статистику каждую ночь по объектам, которые претерпели достаточно изменений с момента последнего сбора статистики по этому объекту, чтобы гарантировать обновление статистики, хотя вы можете отключить это задание или изменить параметры. Поэтому, если сегодня вы соберете статистику с размером выборки 100%, чтобы получить HIGH_VALUE 1000, а затем вставить одну строку со значением 3000 и никогда больше не изменять таблицу, вполне вероятно, что Oracle никогда не соберет статистику по этой таблице. снова (если вы явно не попросили об этом) и что HIGH_VALUE останется 1000 навсегда.

Предполагая, что в столбце нет гистограммы (что является еще одним полным обсуждением), Oracle использует LOW_VALUE и HIGH_VALUE, чтобы оценить, насколько избирательным будет конкретный предикат. Если LOW_VALUE равно 1, HIGH_VALUE равно 1000, в таблице 1 000 000 строк, гистограмма в столбце отсутствует, и вы выполняете запрос, подобный

SELECT *
  FROM some_table
 WHERE column_name BETWEEN 100 and 101

Oracle будет предполагать, что данные равномерно распределены между 1 и 1000, так что этот запрос вернет 1000 строк (умножив количество строк в таблице (1 миллион) на долю диапазона, охватываемого запросом (1/1000) )). Эта оценка селективности, в свою очередь, повлияла бы на определение оптимизатором того, будет ли более эффективно использовать индекс или выполнить сканирование таблицы, какие методы объединения использовать, какой порядок оценки различных предикатов и т. Д. Если у вас есть неравномерное распределение данных, однако, вы, скорее всего, получите гистограмму в столбце, которая дает Oracle более подробную информацию о распределении данных в столбце, чем предоставляют LOW_VALUE и HIGH_VALUE.

...