|
|
|
Почему могла не собраться статистика?
|
|||
|---|---|---|---|
|
#18+
Добрый день! Продакшен встал колом в один из дней. Проблема обнаружилась в том, 1. Что у одного из запросов ( который генерится динамически ) сдвинулся план с обычного к ужасному. 2. Анализ причины, почему сдвинулся план показал, что дело в том, что не собралась статистика по одной из партиции одного из индексов. Точнее, она показывается как собравшаяся ( last_analyzed = корректное время ), но все значения там 0 - количество строк, ndv и т.п. 3. Статистика собиралась сразу после загрузки данных и прямо перед построением плана процедурой содержащей схематично следующий вызов: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. Соответственно по индексам статистика собирается благодаря cascade => true. По самой таблице и по двум индексам из трех она нормально собралась, а когда дело дошло до записи информации о третьем индексе - что-то случилось. Т.к. мой предшественник при написании кода посчитал что падать на сборе статистики - плохая идея, и даже логировать ошибку не нужно - сейчас неизвестно что произошло. А то, что оракл при очевидно упавшем сборе статистики зачем-то обновил last_analyzed, заставляя оптимизатор считать эту статистику актуальной - это уже недоработка оракла. Проблема не воспроизводится - при повторном сборе статистики она собралась нормально. Тем не менее это важный кусок продакшена, и хотелось бы разобраться что произошло и как подобное предотвратить в будущем. Ранее, я уже наблюдал, что dbms_stats написан нетракзакционно, делает там кучу коммитов внутри, и получить, скажем так "половину статистики" ( при том, что оптимизатор будет считать ее полной ) - как раз плюнуть. До этого я сталкивался с этим когда в процессе работы dbms_stats кончилось место в tablespace SYSTEM ( записалась "половина статистики" ) и когда в процессе работы dbms_stats.gather_schema_stats было превышен лимит на количество открытых курсоров. Но в данном случае ни то ни то не актуально - место есть, курсоров хватает. Было ли в вашей практике еще что-нибудь? И как вы решали подобные проблемы? Сейчас я обдумываю между добавлением в процедуру сбора статистики функции check_stats_gathered с перезапуском ее сбора, и просто захинтованием этого запроса так, чтобы плохой план в принципе не мог пролезть ( что будет очень сложно ). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2018, 02:52 |
|
||
|
Почему могла не собраться статистика?
|
|||
|---|---|---|---|
|
#18+
Valergrad, что показывает DBA_OPTSTAT_OPERATION_TASKS? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2018, 05:41 |
|
||
|
Почему могла не собраться статистика?
|
|||
|---|---|---|---|
|
#18+
Valergrad Код: plsql 1. Говнокод. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2018, 08:22 |
|
||
|
Почему могла не собраться статистика?
|
|||
|---|---|---|---|
|
#18+
Valergrad, Заметил, иногда разваливается джоб sql tuning advisor с ORA-13668: The current operation was aborted because it was blocking another session. Может что то подобное и со stats. Правда с таким "обработчиком" этого уже не узнать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2018, 12:56 |
|
||
|
Почему могла не собраться статистика?
|
|||
|---|---|---|---|
|
#18+
kinky cat, Dbms_stats логгирует в свои таблицы. Вьюха выше это бы показала. С sql tuning обычно приведенная проблема связана с оптимизацией dml ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2018, 15:07 |
|
||
|
Почему могла не собраться статистика?
|
|||
|---|---|---|---|
|
#18+
Valergradкак вы решали подобные проблемы? Убирали "when others then null" с занесением в душу автору этой пакости, подло скрывающей проблемы. Затем наблюдали и, установив реальную проблему, решали по показаниям. Это общее правило, к джобам тоже вполне себе применимое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2018, 15:32 |
|
||
|
Почему могла не собраться статистика?
|
|||
|---|---|---|---|
|
#18+
xtenderValergrad, что показывает DBA_OPTSTAT_OPERATION_TASKS? Увы, у нас 11.2 - там такой вьюшки еще нет...Есть только DBA_OPTSTAT_OPERATIONS , там для этой партиции есть только две записи как и полагается - одна из кода, а другая когда я пересобирал статистику сам. Также там видно, что в этот момент собиралось по этой таблице статистика аж по 4-м партициям сразу ( различными процессами ), возможно они друг другу и помешали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2018, 18:37 |
|
||
|
Почему могла не собраться статистика?
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousValergradкак вы решали подобные проблемы? Убирали "when others then null" с занесением в душу автору этой пакости, подло скрывающей проблемы. Затем наблюдали и, установив реальную проблему, решали по показаниям. Это само собой, об этом можно и не говорить отдельно ( хотя автор этого кода давно уже не с нами, и скажу более того - автор этого кода очень авторитетный и уважаемый человек ;) ) Можно ли что-то попробовать до того, как код фикса попадет на продакшен, и ишью произойдет еще раз ( или не раз) ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2018, 18:40 |
|
||
|
Почему могла не собраться статистика?
|
|||
|---|---|---|---|
|
#18+
Valergrad, a wri$_optstat_opr_tasks есть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2018, 19:08 |
|
||
|
Почему могла не собраться статистика?
|
|||
|---|---|---|---|
|
#18+
xtenderValergrad, a wri$_optstat_opr_tasks есть? не, тоже нет) Есть только sys.WRI$_OPTSTAT_HISTHEAD_HISTORY , вот что удалось накопать в ней. Это время загрузки данных в таблицу: Код: plsql 1. 2. 3. 4. Для начала селект из DBA_OPTSTAT_OPERATIONS - что работало в это время. Мы видим, что почти параллельно статистика собиралась по 3м партициям: Код: plsql 1. 2. 3. 4. 5. Вот как выглядит история сбора статистики по "нормальной" партиции 59984, по индексу по которому возникли проблемы ( в другой партиции ): Код: plsql 1. 2. 3. 4. 5. SAVTIME - это время сбора статистики, а статистика там дается которая была перед запуском ( т.е. какая собралась в этот момент - надо смотреть в следующей строке ). Обращает на себя внимание, что в истории показывается как будто статистика по индексу собралась два раза - в течении полсекунды. Отчего, почему - я не знаю. У таблицы - была одна строка ( сорри, не могу сюда скопировать результат - запускал DBA по моей просьбе, и этот результат потерялся ). Но видно, что уже первый раз она собралась нормально - потому что "следующая" строка для 2.16.26 содержит 223097 строк - правильное значение. Теперь посмотрим то же самое по нашей, плохой партиции 59979, но "хорошему" индексу, по которому собралось: Код: plsql 1. 2. 3. 4. 5. 6. Здесь тоже почему-то она собралась как будто бы два раза, и снова уже с первого раза нормально. Дополнительный сбор статистики в 6 вечера - это я запускал, чтобы починить проблему. И наконец, тот самый индекс по которому почему-то не собралось: Код: plsql 1. 2. 3. 4. 5. 6. Тоже два раза, но не собралось оба раза. Когда я собирал в 06 вечера - уже собралось норм, но здесь не видно, т.к. смотреть нужно в следующей строке - которой нету. Вопросы на которые у меня нет ответов: 1. Почему по этому индексу статистика не собралась, а оракл посчитал это нормальным явлением? 2. Почему когда собираешь статистику по таблице, в истории статистики по индексу появляется две строки? Это всегда так, или что-то значит? 3. Почему время сбора статистики ( SAVTIME ) по одному и тому же индексу совпадает вплоть до микросекунды? Может ли быть такое, что у оракла как-то пересеклись сборы статистики между партициями и поэтому вышла ерунда? Ведь сборы статистики по P_RUN_59984 и P_RUN_59978 стартовали чуть раньше, чем данные появились в P_RUN_59979, и там как раз было пусто в этот момент. Или дело всего лишь в том, что оракл просто сохраняет историю статистики с определенным интервалом, поэтому у разных объектов одно и то же SAVTIME? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2018, 21:33 |
|
||
|
Почему могла не собраться статистика?
|
|||
|---|---|---|---|
|
#18+
ValergradSAVTIME - это время сбора статистикиэто время сохранения в историческую таблицу, а analyzetime - время сбора этой статистики. Valergrad1. Почему по этому индексу статистика не собралась, а оракл посчитал это нормальным явлением?слишком мало информации. Смотрел ASH за этот период по сессии джоба? И на случай, если это повторится, можешь включить трассировку сбора статистики: https://blog.pythian.com/options-for-tracing-oracle-dbms_stats/ Valergrad2. Почему когда собираешь статистику по таблице, в истории статистики по индексу появляется две строки? Это всегда так, или что-то значит?это не нормально. предположения есть, но гадать неохота. Глянь ASH или трассу. Valergrad3. Почему время сбора статистики ( SAVTIME ) по одному и тому же индексу совпадает вплоть до микросекунды?SAVTIME - не время сбора, как я уже выше написал. Смотреть надо, что тогда выполнялось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2018, 02:29 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39741804&tid=1883078]: |
0ms |
get settings: |
10ms |
get forum list: |
22ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
62ms |
get topic data: |
14ms |
get forum data: |
4ms |
get page messages: |
74ms |
get tp. blocked users: |
3ms |
| others: | 245ms |
| total: | 444ms |

| 0 / 0 |
