|
|
|
Почему перестал использоваться индекс?
|
|||
|---|---|---|---|
|
#18+
Есть таблица с таким DDL: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Ранее проблем не замечал, но сегодня вдруг обнаружил, что запрос с этой таблицей выполняется долго. Сделал план для такого запроса: Код: plsql 1. 2. 3. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ParameterValueIndex NamePER_ACCT_MOMENT_IDXIndex TypeNORMALUniquenessNONUNIQUEStatusVALIDTableBM_PERIODIC_ACCTTable TypeTABLETablespaceBM_INDEXBuffer PoolDEFAULTPartitionedNoTemporaryNoInitial Transactions2Max Transactions255Initial Extent Size64 KbMinimum Extents1Maximum Extents2 147 483 645Percent Free10Degree1Instances1Last Analyzed06.02.2017 13:45:12BLevel2Leaf Blocks7 353Distinct Keys307 203Avg Leaf Blocks Per Key1Avg Data Blocks Per Key1Clustering Factor311 228Num Rows1 471 631Sample Size1 471 631GeneratedNJoin IndexNo Что может быть причиной того, что индекс не используется? ________________________ Мы смотрим с оптимизмом... ...в оптический прицел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2017, 13:57 |
|
||
|
Почему перестал использоваться индекс?
|
|||
|---|---|---|---|
|
#18+
Если указать хинт: Код: plsql 1. 2. 3. то индекс используется и запрос выполняется быстро. А почему CBO может считать, что индекс использовать не следует? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2017, 14:22 |
|
||
|
Почему перестал использоваться индекс?
|
|||
|---|---|---|---|
|
#18+
Alibek B.Делал пересчет статистики, в TOAD по индексу не вижу каких-либо проблем Статистики чего? Если таблицы, то чтобы не гадать, снимай 10053 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2017, 14:24 |
|
||
|
Почему перестал использоваться индекс?
|
|||
|---|---|---|---|
|
#18+
Как насчет гистограмм -- может данные за этот месяц занимают полтаблицы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2017, 15:13 |
|
||
|
Почему перестал использоваться индекс?
|
|||
|---|---|---|---|
|
#18+
Alibek B., Причин может быть очень много. Надо 10053 снимать, чтобы понять. Может кто-то запустил такой же запрос, но за больший периоД и первый раз оптимизатор решил привязать его план к фулскану. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2017, 15:36 |
|
||
|
Почему перестал использоваться индекс?
|
|||
|---|---|---|---|
|
#18+
У него все-таки литералы, а не бинды ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2017, 15:40 |
|
||
|
Почему перестал использоваться индекс?
|
|||
|---|---|---|---|
|
#18+
В TOAD я выбрал индекс и выполнил команду Analyze Index, в статусной строке я получил сообщение, что статистика пересчитана. По всей видимости статистика индекса. Как снять 10053? Выполнил команду ALTER SESSION SET EVENTS='10053 trace name context forever, level 1', затем запрос, затем ALTER SESSION SET EVENTS '10053 trace name context off'. В каталоге bdump появился файл billing_lgwr_23999.trc. Я выполнил команду tkprof billing_lgwr_23999.trc billing_lgwr_23999.res, файл billing_lgwr_23999.res создался, но я не нахожу в нем полезной информации: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2017, 15:43 |
|
||
|
Почему перестал использоваться индекс?
|
|||
|---|---|---|---|
|
#18+
10053 читается в сыром виде tkprof только для 10046 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2017, 15:52 |
|
||
|
Почему перестал использоваться индекс?
|
|||
|---|---|---|---|
|
#18+
AlexFF__|Alibek B.Делал пересчет статистики, в TOAD по индексу не вижу каких-либо проблем Статистики чего? Если таблицы, то чтобы не гадать, снимай 10053 Тут нужно было писать дополнение? автора если собирал не табличную статистику, то собери ее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2017, 15:55 |
|
||
|
Почему перестал использоваться индекс?
|
|||
|---|---|---|---|
|
#18+
Можно попробовать пересобрать статистику таблицы + индекса , предварительно полностью удалив предыдущую. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2017, 16:05 |
|
||
|
Почему перестал использоваться индекс?
|
|||
|---|---|---|---|
|
#18+
Вячеслав Любомудров10053 читается в сыром виде В таком случае там нет полезных данных. В файле содержится много записей вида: Код: plaintext 1. 2. Если период сократить до суток, то индекс используется: Код: plsql 1. 2. select * from BM_PERIODIC_ACCT PA where PA.MOMENT between DATE'2016-01-01' and DATE'2016-01-02' Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Стало быть с индексом все в порядке, это у меня такие данные? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2017, 16:11 |
|
||
|
Почему перестал использоваться индекс?
|
|||
|---|---|---|---|
|
#18+
Alibek B.Trace file: billing_lgwr_23999.trc Не тот файл смотришь . Это трейс lgwr (background process). Твой будет называться sid_ora_pid_traceid.trc. Check TRACEFILE_IDENTIFIER . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2017, 16:20 |
|
||
|
Почему перестал использоваться индекс?
|
|||
|---|---|---|---|
|
#18+
Точно, спасибо. А на что именно смотреть? Там около 30КБ. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2017, 17:07 |
|
||
|
Почему перестал использоваться индекс?
|
|||
|---|---|---|---|
|
#18+
Alibek B., Лучше весь . Код: plsql 1. 2. 3. 4. Собственно причина почему выбран фтс. А теперь вспоминаем весь список oracle optimizer settings/features которые влияют на index cost в том числе - optimizer_index_cost_adj, sreadtim (system statistics) и проверяем их. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2017, 18:06 |
|
||
|
Почему перестал использоваться индекс?
|
|||
|---|---|---|---|
|
#18+
Прикладываю в аттаче. Странно, что CBO посчитал оптимальным делать полный скан таблицы (записи в таблице более-менее ровно распределены по месяцам, с постепенным увеличением количества записей в месяц), но видимо у него были свои соображения. Мне нужно получить данные примерно за 6 лет и мне быстрее оказалось прогнать этот запрос в цикле с суточным интервалом (при таком интервале индекс используется), чем запускать несколько раз для годовых периодов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2017, 19:59 |
|
||
|
Почему перестал использоваться индекс?
|
|||
|---|---|---|---|
|
#18+
Alibek B., Таблица размером в 30 мегабайт (70 000>записей). Я бы тоже на месте оптимизатора не стал бы фулскан делать. Говорите в цикле посуточно быстрее? А попробуйте в цикле по rowid или pk с обработкой и агрегацией. Уверяю будет еще быстрее и докажет эффективность фулскана. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2017, 20:32 |
|
||
|
Почему перестал использоваться индекс?
|
|||
|---|---|---|---|
|
#18+
Alibek B., в общем-то, оракл все правильно сделал(если не учитывать насколько у тебя таблица и индекс закэшированы): при IRS у тебя 367 блоков должно считаться из индекса(из 7тысяч с лишним блоков в индексе) и сделать 71800 лукапов в таблицу по table access by rowid, при том что вся таблица у тебя всего лишь 12тысяч блоков а при fts всего лишь считать 12 тысяч блоков по 16 блоков за раз. На современных нормально работающих( не перегруженных по IO) системах скорость многоблочного чтения почти не отличается от одноблочного. Alibek B.то индекс используется и запрос выполняется быстро.а ты проверял-то полное выполнение запроса или тупо до первых отфетченных записей? По-хорошему даже если разница и будет в пользу IRS, то должна быть небольшая ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2017, 02:05 |
|
||
|
Почему перестал использоваться индекс?
|
|||
|---|---|---|---|
|
#18+
xtenderа ты проверял-то полное выполнение запроса или тупо до первых отфетченных записей? В том запросе, который был приведен в самом начале (простой select из одной таблицы) я всю выборку не получал, только первые записи. В конечном варианте в запросе будет группировка по датам и запрос вернет не более 31 строки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2017, 15:36 |
|
||
|
Почему перестал использоваться индекс?
|
|||
|---|---|---|---|
|
#18+
Alibek B., Преждевременная оптимизация... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2017, 17:08 |
|
||
|
Почему перестал использоваться индекс?
|
|||
|---|---|---|---|
|
#18+
Все началось с того, что запросы, которые я использовал ранее, вдруг стали выполнятся значительно дольше. В процессе выяснения причин оказалось, что по таблице BM_PERIODIC_ACCT почему-то перестал использоваться индекс. Если делать запрос по большому периоду, он выполняется очень долгое время или вообще зависает. А посуточный проход в цикле получился быстрее и более предсказуемо. Также я выполнил совет по сбросу статистики не только для индексов, но и для таблицы - и похоже помогло, запрос за месячный период снова использует индекс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2017, 17:12 |
|
||
|
Почему перестал использоваться индекс?
|
|||
|---|---|---|---|
|
#18+
Вячеслав ЛюбомудровУ него все-таки литералы, а не бинды зависит от параметра cursor_sharing ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2017, 09:44 |
|
||
|
Почему перестал использоваться индекс?
|
|||
|---|---|---|---|
|
#18+
Alibek B., Это радует, что совет всё таки был замечен :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2017, 11:03 |
|
||
|
Почему перестал использоваться индекс?
|
|||
|---|---|---|---|
|
#18+
Есть такой запрос: Код: plsql 1. 2. 3. 4. Выполняется практически мгновенно, возвращает меньше десятка записей. Если убираю хинт, выполняется долго (3-4 минуты). Планы с хинтом и без хинта отличаются (с хинтом INDEX RANGE SCAN и NL, без хинта INDEX FAST FULL SCAN и HASH JOIN). В таблице BM_SERVICE_MONEY сотни миллионов записей. Каких-либо нестандартных вещей или больших изменений данных с ней не делалось. Индекс SVRM_SERVICE_IDX составной (состоит из полей SERVICE_ID, FDATE). Мне не совсем понятно, почему оптимизатор ошибается. Трассировку 10053 я пока не делал, может быть тут есть какая-то очевидная причина? Может быть нужно как-то задействовать поле FDATE, чтобы индекс был задействован? При этом есть еще такой запрос, использующий результаты предыдущего запроса: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Целиком он выполняется быстро (400мс после очистки кеша). Но если убрать последнюю строку с LEFT JOIN, то выполнение занимает 3-4 минуты. В этом тексте запроса FDATE вообще отсутствует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2017, 11:44 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39400296&tid=1886227]: |
0ms |
get settings: |
6ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
163ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
| others: | 211ms |
| total: | 470ms |

| 0 / 0 |
