Как и для всей статистики, относящейся к оптимизатору, эти значения являются оценками с различной степенью точности с момента сбора статистики в таблице. Таким образом, вполне ожидаемо, что они будут близки, но не совсем точны, и вполне возможно, что они будут совершенно неверными.
Когда вы собираете статистику, вы указываете процент строк (или блоков), которые должны быть выбраны. Можно указать размер выборки 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
.