Oracle не использует индексы
У меня очень большая таблица в oracle 11g, которая имеет очень простой индекс в поле char (обычно это Y или N). Если я просто выполняю очередь, как показано ниже, для возврата требуется около 10 секунд
Однако, если я заставляю его использовать индекс, который я создаю, он занимает 80 мс
Также, если я буду работать под планом объяснения, как ниже:
Для моего плана я получил:
Для второго pla я получил:
Что доказывает, что если я не укажу явный оракул, чтобы использовать индекс, он его не использует, мой вопрос в том, почему оракул не использует этот индекс? Oracle, как правило, достаточно умна, чтобы принимать решения в 10 раз лучше меня, это первый раз, когда я на самом деле вынуждаю оракул использовать индекс, и мне это не очень удобно.
У кого-нибудь есть хорошее объяснение для решения оракула не использовать индекс в этом очень явном случае?
В столбце QueueProcessed, вероятно, отсутствует гистограмма, поэтому Oracle не знает, что данные искажены.
Если Oracle не знает, что данные искажены, он будет считать предикат равенства QueueProcessed = ‘N’ , возвращает DBA_TABLES.NUM_ROWS/DBA_TAB_COLUMNS.NUM_DISTINCT. Оптимизатор считает, что запрос возвращает половину строк в таблице. На основе времени возврата 80 мс реальное число возвращаемых строк невелико.
Сканирование диапазона индекса обычно работает хорошо, когда они выбирают небольшой процент строк. Сканирование индекса индекса считывается из структуры данных по одному блоку за раз. И если данные распределены случайным образом, в любом случае может потребоваться прочитать каждый блок данных из таблицы. По этим причинам, если запрос обращается к большой части таблицы, более эффективно использовать многоблочный просмотр полной таблицы.
Оценка плохой мощности от перекошенных данных заставляет Oracle думать, что полное сканирование таблицы лучше. Проблема с созданием гистограммы.
Пример схемы
Создайте таблицу, залейте ее перекошенными данными и соберите статистику в первый раз.
Проблема с первым исполнением.
В этом случае параметры статистики по умолчанию не собирают гистограммы в первый раз. План показывает полное сканирование таблицы и оценки строк = 50000, ровно половину.
Создание гистограммы
Обычно обычно задаются параметры статистики по умолчанию. Гистограмма не может быть собрана по нескольким причинам. Они могут быть отключены вручную — проверьте задачи, задания или настройки, установленные администратором баз данных.
Кроме того, гистограммы собираются только автоматически на столбцах, которые перекошены и используются. Сбор гистограмм может занять некоторое время, нет необходимости создавать гистограмму в столбце, который никогда не используется в соответствующем предикате. Oracle отслеживает использование столбца и может извлечь выгоду из гистограммы, хотя данные теряются, если таблица отбрасывается.
Запуск выборочного запроса и повторной сбор статистики приведет к отображению гистограммы:
Теперь используются строки = 100 и индекс.
Создание гистограммы
Попытайтесь определить, почему гистограмма отсутствовала. Убедитесь, что статистика собрана с настройками по умолчанию, нет странных предпочтений в столбцах или таблицах, и эта таблица не будет постоянно удалена и перезагружена.
Если вы не можете полагаться на задание статистики по умолчанию для своего процесса, вы можете вручную собрать гистограммы с параметром method_opt следующим образом:
Источник
Oracle не использует индексы
У меня очень большая таблица в oracle 11g, у которой очень простой индекс в поле char (обычно это Y или N). Если я просто выполняю очередь, как показано ниже, для возврата требуется около 10 секунд
Однако, если я заставлю его использовать созданный мной индекс, потребуется 80 мс.
Также, если я использую план объяснения, как показано ниже:
На первый план мне досталось:
Для второго пла у меня получилось:
Что доказывает, что если я явно не скажу oracle использовать индекс, он его не использует, мой вопрос: почему oracle не использует этот индекс? Oracle обычно достаточно умен, чтобы принимать решения в 10 раз лучше меня, это первый раз, когда мне действительно приходится заставлять Oracle использовать индекс, и мне это не очень удобно.
Есть ли у кого-нибудь хорошее объяснение решения оракула не использовать индекс в этом очень явном случае?
2 ответа
В столбце QueueProcessed, вероятно, отсутствует гистограмма, поэтому Oracle не знает, что данные искажены.
Если Oracle не знает, что данные искажены, он предположит, что предикат равенства, QueueProcessed = ‘N’ , возвращает DBA_TABLES.NUM_ROWS / DBA_TAB_COLUMNS.NUM_DISTINCT. Оптимизатор считает , что запрос возвращает половину строк в таблице. Исходя из времени возврата 80 мс, реальное количество возвращаемых строк невелико.
Сканирование диапазона индекса обычно работает хорошо только тогда, когда выбирается небольшой процент строк. Индексный диапазон просматривает чтение из структуры данных по одному блоку за раз. И если данные распределены случайным образом, возможно, в любом случае потребуется прочитать каждый блок данных из таблицы. По этим причинам, если запрос обращается к большой части таблицы, более эффективно использовать многоблочное полное сканирование таблицы.
Плохая оценка количества элементов из искаженных данных заставляет Oracle думать, что полное сканирование таблицы лучше. Создание гистограммы решит проблему.
Пример схемы
Создайте таблицу, заполните ее искаженными данными и с первого раза соберите статистику.
При первом выполнении возникнут проблемы.
В этом случае настройки статистики по умолчанию не собирают гистограммы первый раз. План показывает полное сканирование таблицы и оценивает Rows = 50000, ровно половину.
Создайте гистограмму
Обычно достаточно стандартных настроек статистики. Гистограмма не может быть собрана по нескольким причинам. Их можно отключить вручную — проверьте, есть ли задачи, задания или предпочтения, установленные администратором баз данных.
Кроме того, гистограммы автоматически собираются только по наклонным и используемым столбцам. Сбор гистограмм может занять время, нет необходимости создавать гистограмму для столбца, который никогда не используется в соответствующем предикате. Oracle отслеживает, когда используется столбец, и может получить выгоду от гистограммы, хотя эти данные теряются при удалении таблицы.
При выполнении образца запроса и повторного сбора статистики появится гистограмма:
Теперь Rows = 100, и используется индекс.
Создайте гистограмму
Попытайтесь определить, почему отсутствовала гистограмма. Убедитесь, что статистика собирается со значениями по умолчанию, нет никаких странных предпочтений столбцов или таблиц и что таблица не удаляется и не перезагружается постоянно.
Если вы не можете полагаться на задание статистики по умолчанию для вашего процесса, вы можете вручную собрать гистограммы с параметром method_opt следующим образом:
Ответ — по крайней мере, первый, который приведет к большему количеству вопросов — прямо в планах. Стоимость и время выполнения первого плана примерно вдвое меньше, чем у второго плана. В отсутствие подсказки Oracle выбирает план, который, по ее мнению, будет работать быстрее.
Итак, конечно, следующий вопрос: почему в данном случае его оценка так далека. Мало того, что расчетное время неверно относительно друг друга, оба значения намного больше, чем то, что вы действительно испытываете при выполнении запроса.
Первое, на что я обращаю внимание, — это приблизительное количество возвращаемых строк. В обоих случаях оптимизатор предполагает, что в таблице содержится около 691 000 строк, соответствующих вашему предикату. Это близко к истине или очень далеко? Если это далеко, то обновление статистики может быть правильным решением. Хотя, если в столбце есть только два возможных значения, я был бы немного удивлен, если бы существующая статистика была настолько неосновательной.
Источник
Oracle не работают индексы
������ proc.v$Al_Active_Auth_small:
ORACLE ������ ���������� ������ DOC_OUTWARD, �������� �� ���� �� ������ v$al_active_auth_small.
��� � ���� �������� ?
| | |
| �������� ����� Member ������: | �������-�� �� ����� ����� ������� ������ ���������? |
| 29 ��� 05, 12:57����[1824915] �������� | ���������� �������� ���������� | |
| | |
| softy Member ������: from Russia | ����� «+» ������ �� ����� ��? |
| 29 ��� 05, 13:20����[1825085] �������� | ���������� �������� ���������� | |
| | |||
| �������� ����� Member ������: |
| ||
| 29 ��� 05, 13:30����[1825152] �������� | ���������� �������� ���������� | |||
| | |
| softy Member ������: from Russia | � ���, ����� ��� ��� ���, � �� ����? |
| 29 ��� 05, 13:32����[1825166] �������� | ���������� �������� ���������� | |
| | |||
| Andrew Max Member ������: |
� �� ���������� ������ ���� NO_INDEX �� ����������� view � �������� ��� �� ���������� ����, ������� ������� �������� � ���� �����: | ||
| 29 ��� 05, 13:46����[1825239] �������� | ���������� �������� ���������� | |||
| | |
| Andrei Fomichev Member CREATE INDEX bwx.doc_date ON bwx.doc (amnd_date ASC); CREATE UNIQUE INDEX bwx.doc_outward ON bwx.doc( 40 ��� �������, ������� amnd_date > sysdate — 35 ��������� ����� 2 ��� �������. | |
| 29 ��� 05, 14:18����[1825387] �������� | ���������� �������� ���������� | |
| | |||
| Andrei Fomichev Member ������: ������ |
SQL Statement from editor: select * from v$al_limits2 where f_i=163 Statement Type=FILTER (1) SELECT STATEMENT CHOOSE | ||
| 29 ��� 05, 14:22����[1825399] �������� | ���������� �������� ���������� | |||
| | |
| Andrei Fomichev Member ������: ������ | SQL Statement from editor: Statement Type=SORT Источник |