Oracle не работают индексы

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 следующим образом:

Читайте также:  Что делать если не работает ubuntu software

Источник

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.

��� � ���� �������� ? 29 ��� 05, 12:43����[1824838] �������� | ���������� �������� ����������

Re: ORACLE 9.2.0.6: �� �������� NO_INDEX [new]
�������� �����
Member

������:
���������: 3451

�������-�� �� ����� ����� ������� ������ ���������?
29 ��� 05, 12:57����[1824915] �������� | ���������� �������� ����������
Re: ORACLE 9.2.0.6: �� �������� NO_INDEX [new]
softy
Member

������: from Russia
���������: 5911

����� «+» ������ �� ����� ��?
29 ��� 05, 13:20����[1825085] �������� | ���������� �������� ����������
Re: ORACLE 9.2.0.6: �� �������� NO_INDEX [new]
�������� �����
Member

������:
���������: 3451

softbuilder@inbox.ru
����� «+» ������ �� ����� ��?
��� ����� � ����� ��� ��� � ������������� �������� ���������.
29 ��� 05, 13:30����[1825152] �������� | ���������� �������� ����������
Re: ORACLE 9.2.0.6: �� �������� NO_INDEX [new]
softy
Member

������: from Russia
���������: 5911

� ���, ����� ��� ��� ���, � �� ����?
29 ��� 05, 13:32����[1825166] �������� | ���������� �������� ����������
Re: ORACLE 9.2.0.6: �� �������� NO_INDEX [new]
Andrew Max
Member

������:
���������: 1045

Oracle9i Database Performance Tuning Guide and Reference Release 2 (9.2)
Access Path and Join Hints Inside Views
Access path and join hints can appear in a view definition.

If the view is a subquery (that is, if it appears in the FROM clause of a SELECT statement), then all access path and join hints inside the view are preserved when the view is merged with the top-level query.

For views that are not subqueries, access path and join hints in the view are preserved only if the top-level query references no other tables or views (that is, if the FROM clause of the SELECT statement contains only the view).

� �� ���������� ������ ���� NO_INDEX �� ����������� view � �������� ��� �� ���������� ����, ������� ������� �������� � ���� �����:

29 ��� 05, 13:46����[1825239] �������� | ���������� �������� ����������
Re: ORACLE 9.2.0.6: �� �������� NO_INDEX [new]
Andrei Fomichev
Member

CREATE INDEX bwx.doc_date ON bwx.doc (amnd_date ASC);

CREATE UNIQUE INDEX bwx.doc_outward ON bwx.doc(
posting_status ASC, amnd_state ASC, outward_status ASC,
target_channel ASC, fx_settl_date ASC, id ASC )

40 ��� �������, ������� amnd_date > sysdate — 35 ��������� ����� 2 ��� �������.

29 ��� 05, 14:18����[1825387] �������� | ���������� �������� ����������
Re: ORACLE 9.2.0.6: �� �������� NO_INDEX [new]
Andrei Fomichev
Member

������: ������
���������: 453

Andrew Max
� �� ���������� ������ ���� NO_INDEX �� ����������� view � �������� ��� �� ���������� ����, ������� ������� �������� � ���� �����:

SQL Statement from editor:

select * from v$al_limits2 where f_i=163

Statement Type=FILTER
Cost=0 TimeStamp=29-08-05::14::22:26

(1) SELECT STATEMENT CHOOSE
Est. Rows: 1 Cost: 6
(17) SORT AGGREGATE
Est. Rows: 1
(16) FILTER
(15) NESTED LOOPS OUTER
(12) NESTED LOOPS
Est. Rows: 1 Cost: 2�877
(9) NESTED LOOPS
Est. Rows: 1 Cost: 2�876
(6) NESTED LOOPS
Est. Rows: 1 Cost: 2�875
(3) TABLE ACCESS BY INDEX ROWID BWX.DOC [Analyzed]
(3) Blocks: 1�597�555 Est. Rows: 1 of 37�344�945 Cost: 2�874
Tablespace: OWDOC_D
(2) UNIQUE INDEX RANGE SCAN BWX.DOC_OUTWARD [Analyzed]
Est. Rows: 39�302 Cost: 15�747
(5) TABLE ACCESS BY INDEX ROWID BWX.FX_RATE [Analyzed]
(5) Blocks: 1�827 Est. Rows: 1 of 181�388 Cost: 1
Tablespace: OWCONST_D
(4) UNIQUE INDEX RANGE SCAN BWX.FX_RATE_D [Analyzed]
Est. Rows: 1 Cost: 1
(8) TABLE ACCESS BY INDEX ROWID BWX.FX_RATE [Analyzed]
(8) Blocks: 1�827 Est. Rows: 1 of 181�388 Cost: 1
Tablespace: OWCONST_D
(7) UNIQUE INDEX RANGE SCAN BWX.FX_RATE_D [Analyzed]
Est. Rows: 1 Cost: 1
(11) TABLE ACCESS BY INDEX ROWID BWX.ACNT_CONTRACT [Analyzed]
(11) Blocks: 67�232 Est. Rows: 1 of 1�581�441 Cost: 1
Tablespace: OWCONTR_D
(10) UNIQUE INDEX UNIQUE SCAN BWX.PK_ACNT_CONTRACT [Analyzed]
Est. Rows: 1
(14) TABLE ACCESS BY INDEX ROWID BWX.ACNT_CONTRACT [Analyzed]
(14) Blocks: 67�232 Est. Rows: 1 of 1�581�441 Cost: 1
Tablespace: OWCONTR_D
(13) UNIQUE INDEX UNIQUE SCAN BWX.PK_ACNT_CONTRACT [Analyzed]
Est. Rows: 1
(30) NESTED LOOPS SEMI
Est. Rows: 1 Cost: 6
(28) NESTED LOOPS OUTER
Est. Rows: 1 Cost: 4
(25) NESTED LOOPS OUTER
Est. Rows: 1 Cost: 3
(22) NESTED LOOPS
Est. Rows: 1 Cost: 2
(19) TABLE ACCESS BY INDEX ROWID BWX.F_I [Analyzed]
(19) Blocks: 20 Est. Rows: 1 of 1�297 Cost: 1
Tablespace: OWCONST_D
(18) UNIQUE INDEX UNIQUE SCAN BWX.PK_F_I [Analyzed]
Est. Rows: 1 Cost: 1
(21) TABLE ACCESS BY INDEX ROWID PROC.AL_AGENTS [Not Analyzed]
(21) Est. Rows: 28 Cost: 1
Tablespace: OWSTATIC_D
(20) UNIQUE INDEX UNIQUE SCAN PROC.PK_AL_AGENTS_CODE [Not Analyzed]
Est. Rows: 1
(24) TABLE ACCESS BY INDEX ROWID BWX.USAGE_LIMITER [Analyzed]
(24) Blocks: 6�529 Est. Rows: 1 of 412�983 Cost: 1
Tablespace: OWCONTR_D
(23) UNIQUE INDEX UNIQUE SCAN BWX.PK_USAGE_LIMITER [Analyzed]
Est. Rows: 1
(27) TABLE ACCESS BY INDEX ROWID BWX.USAGE_TEMPLATE [Analyzed]
(27) Blocks: 5�790 Est. Rows: 1 of 426�415 Cost: 1
Tablespace: OWSTATIC_D
(26) UNIQUE INDEX UNIQUE SCAN BWX.PK_USAGE_TEMPLATE [Analyzed]
Est. Rows: 1
(29) TABLE ACCESS FULL BWX.PM_BANK [Analyzed]
(29) Blocks: 5 Est. Rows: 94 of 292 Cost: 2
Tablespace: OWCONST_D

29 ��� 05, 14:22����[1825399] �������� | ���������� �������� ����������
Re: ORACLE 9.2.0.6: �� �������� NO_INDEX [new]
Andrei Fomichev
Member

������: ������
���������: 453

SQL Statement from editor:

Statement Type=SORT
Cost=0 TimeStamp=29-08-05::14::37:39

Источник

Оцените статью