|
изменение плана со временем
|
|||
---|---|---|---|
#18+
Вот ситуация. Есть отчет, там большой запрос. Все сначала работает относительно быстро. Вся статистика обновляется каждую ночь. Потом - бац, отчет начинает выполняться ну очень медленно. Вроде как ломается план запроса. Перекомпиляцией дело поравляется, но ненадолго. Вот что именно происходит, что "план ломается"? Что заставляет сервер менять план? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2013, 17:11 |
|
изменение плана со временем
|
|||
---|---|---|---|
#18+
"отчет" = хранимка, небось? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2013, 20:23 |
|
изменение плана со временем
|
|||
---|---|---|---|
#18+
Crimean"отчет" = хранимка, небось?да, точно ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2013, 20:49 |
|
изменение плана со временем
|
|||
---|---|---|---|
#18+
Зихинтуй запрос, и план будет всегда тот, который тебе нужен ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2013, 21:45 |
|
изменение плана со временем
|
|||
---|---|---|---|
#18+
Глеб, вроде разговор идет о том, почему так происходит, а не как с этим бороться. Какие стандатные причины таких проблем ? Сам такое видел много раз. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2013, 21:51 |
|
изменение плана со временем
|
|||
---|---|---|---|
#18+
IMHO: за отведенный квант времени оптимизатор не успевает выбрать наиболее оптимальный план и использует с наименьшей стоимостью из перебранных им вариантов, либо тупо ошибается в оценке оптимальности, что бывает на сложных или многошаговых запросах часто. А пересматривать план для скомпиленного запроса (процедуры) его заставляет банальная причина - статистики изменились. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2013, 21:59 |
|
изменение плана со временем
|
|||
---|---|---|---|
#18+
Глеб, тогда почему та-же самая перекомпиляция плана помогает решить проблему ? Причем в 90% случаев, если слатал план, то перекомпилировал и все норм. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2013, 22:41 |
|
изменение плана со временем
|
|||
---|---|---|---|
#18+
ГлебЗихинтуй запрос, и план будет всегда тот, который тебе нужен это если распределение данных для параметров построение постоянное ) а иначе регулярно будут проблемы если грубо - то option( recompile ) а если точно - надо смотреть хороший и плохой планы и вообще смотреть на отчет ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2013, 20:44 |
|
изменение плана со временем
|
|||
---|---|---|---|
#18+
ExpromentГлеб, вроде разговор идет о том, почему так происходит, а не как с этим бороться. Какие стандатные причины таких проблем ? Сам такое видел много раз. Это очень долго рассказывать и достаточно трудно понять, почему именно так. Очень много причин, и вовсе ее потому, что в развитое баги и он недоделанный. В двух словах — потому что оптимизатор — это очень сложная штука. А лечить — хинтами. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2013, 23:07 |
|
изменение плана со временем
|
|||
---|---|---|---|
#18+
MasterZiv, была на прошлой работе процедура, план которой слетал раз в месяц. Как только данная операция начинала тормозить - сразу писали в IT и процу перекомпилировали. При этом каждый раз это помогало. Порой с момента падения плана проходило не более минуты, как его перекомпилировали руками, т.е. общее состояние базы за это время поменяться не могло(ну не каждый раз ведь). К сожалению плохой план никто не зафиксировал и в итоге решили проблему хинтами. Единственная причина, которую тут смог предположить, что автоматическая перекомпиляция как-то отличается от перекомпиляции руками. При разовом падении плана, можно сослаться на "оптимизатор затупил", но если это происходит регулярно... ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2013, 00:19 |
|
изменение плана со временем
|
|||
---|---|---|---|
#18+
MasterZiv, была на прошлой работе процедура, план которой слетал раз в месяц. Охотно верю... автор Как только данная операция начинала тормозить - сразу писали в IT и процу перекомпилировали. При этом каждый раз это помогало. Порой с момента падения плана проходило не более минуты, как его перекомпилировали руками, т.е. общее состояние базы за это время поменяться не могло(ну не каждый раз ведь). К сожалению плохой план никто не зафиксировал и в итоге решили проблему хинтами. Ну и верно сделали. авторЕдинственная причина, которую тут смог предположить, что автоматическая перекомпиляция как-то отличается от перекомпиляции руками. При разовом падении плана, можно сослаться на "оптимизатор затупил", но если это происходит регулярно... Нет, причина такого поведения чаще всего -- вытеснение процедуры из процедурного кэша и затем при след. выполнении помещение обратно в кэш (т.е. оптимизация запросов) под другие значения параметров процедуры. Это в "Автоматическом" режиме. А в "ручном" режиме программист использует ему заранее известные "правильные" наборы параметров. Могут быть и другие сценарии. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2013, 10:39 |
|
изменение плана со временем
|
|||
---|---|---|---|
#18+
MasterZiv ... Это очень долго рассказывать и достаточно трудно понять, почему именно так. Очень много причин, и вовсе ее потому, что в развитое баги и он недоделанный. В двух словах — потому что оптимизатор — это очень сложная штука. ...Ну необязательно рассказывать. Ссылки на статьи можете кинуть? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2013, 10:40 |
|
изменение плана со временем
|
|||
---|---|---|---|
#18+
план-аэропланMasterZiv ... Это очень долго рассказывать и достаточно трудно понять, почему именно так. Очень много причин, и вовсе ее потому, что в развитое баги и он недоделанный. В двух словах — потому что оптимизатор — это очень сложная штука. ...Ну необязательно рассказывать. Ссылки на статьи можете кинуть? Я такую статью ещё пока не написал... Напишу -- тогда может быть смогу кинуть. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2013, 10:44 |
|
изменение плана со временем
|
|||
---|---|---|---|
#18+
MasterZivплан-аэропланпропущено... Ну необязательно рассказывать. Ссылки на статьи можете кинуть? Я такую статью ещё пока не написал... Напишу -- тогда может быть смогу кинуть.имел в виду статьи не только вашего авторства. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2013, 10:50 |
|
изменение плана со временем
|
|||
---|---|---|---|
#18+
MasterZiv... Нет, причина такого поведения чаще всего -- вытеснение процедуры из процедурного кэша и затем при след. выполнении помещение обратно в кэш (т.е. оптимизация запросов) под другие значения параметров процедуры. ...уточнить, план существует только в кэше? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2013, 11:04 |
|
изменение плана со временем
|
|||
---|---|---|---|
#18+
план-аэропланMasterZivпропущено... Я такую статью ещё пока не написал... Напишу -- тогда может быть смогу кинуть.имел в виду статьи не только вашего авторства. Случайные колебания плана можно объяснить "случайной загрузкой процессора". Оптимизатор (в теории) опирается на ограничение в форме "надо найти план за N (милли)секунд", если оптимальный план находится в конце перебираемых вариантов, то любая доп. нагрузка на сервер может приводить к "недоперебору" вариантов и, как результат, облому. Вот и фся статья. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2013, 11:08 |
|
изменение плана со временем
|
|||
---|---|---|---|
#18+
MasterZiv, вообще да.. если проца была перекомпилирована с некоторыми нестандартными параметрами, то для стандартных её выполнение может сильно отличаться. Как-то не подумал об этом :) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2013, 11:08 |
|
изменение плана со временем
|
|||
---|---|---|---|
#18+
план-аэроплан, если установлено, что план именно "ломается", то есть заменяется на худший, то можно попробовать отловить рекомпиляцию и найти её причину http://support.microsoft.com/kb/308737/en-us ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2013, 11:25 |
|
изменение плана со временем
|
|||
---|---|---|---|
#18+
Таймаут оптимизатора измеряется не временем, а количеством задач оптимизации, которое предварительно отводит себе сервер для оптимизации запроса. Оно зависит не от загруженности процессора, а от "сложности" запроса - количества и свойств логических групп оптимизации (типа "я угадаю эту мелодию с пяти нот...", т.е. "я построю план этого запроса за столько-то шагов..."). На мой взгляд, гораздо более вероятная причина разных планов, это пресловутое прослушивание параметров, сохранение и последующее переиспользование плана для тех значений, где он уже неэффективен. Причина довольно распространенная и главное проверить просто. В следующий раз, когда начнуться тормоза, зафиксируйте это на 5 минут, попросите никого ничего не трогать. Запустите профайлер и отловите вызов долгой процедуры, копируйте себе в SSMS текст вызова, где будут указаны все параметры, кроме того, скопируйте все настройки соединения (они тоже будут в профайлере, если выбирать шаблон по-умолчанию). Типа такого должно быть. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Включите в студии Include Actual Execution Plan и выполните. Посмотрите на время, если будет долго, то вы поймали ситацию плюс у вас есть нэффективный действительный план. Сохраните его (на всякий случай) и можете анализировать (обратите внимание на "Parameter Compiled Value" и "Parameter Runtime Value"). Можно сразу в профайлере включить соотв.событие, чтобы увидеть план. Теперь можете рекомпилировать процедуру, и выполнить запрос еще раз и снова посмотреть план. Сравнить, с тем, что был при прошлом, медленном выполнении. Хорошие кандидаты на такие случаи - универсальные процедуры, в которых набор возвращаемых данных может сильно меняться в зависимости от значений параметров. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2013, 15:28 |
|
изменение плана со временем
|
|||
---|---|---|---|
#18+
SomewhereSomehowТаймаут оптимизатора измеряется не временем, а количеством задач оптимизации, которое предварительно отводит себе сервер для оптимизации запроса. Оно зависит не от загруженности процессора, а от "сложности" запроса - количества и свойств логических групп оптимизации (типа "я угадаю эту мелодию с пяти нот...", т.е. "я построю план этого запроса за столько-то шагов..."). Хе-хе. Может она и в штуках таймаут измеряет, но http://mssqlwiki.com/2012/10/07/optimizer-timeout-or-optimizer-memory-abort/ "This is called optimizer timeout (based on the number of plans considered relative to the cost of the best plan so far)." Как бе намекает, что не просто "штуки"... а этот хренов "cost of the best plan" может изменяться, ну и "штуки" с им. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2013, 05:36 |
|
изменение плана со временем
|
|||
---|---|---|---|
#18+
aleks2, Не понял, к чему это вы? Я разве говорил что он не изменяется на протяжении всего процесса оптимизации? Таймаут задает некоторый бюджет задач оптимизации, который оптимизатор расходует. Могу расписать подробнее, если интересно (хотя я вроде описывал у себя в блоге это уже, ну да ладно, "эх раз, еще раз"). Основные понятия Memo — структура в памяти сервера, которая используется для хранения и анализа получаемых в результате преобразований деревьев операторов. Group — группа эквивалентности, часть структуры Memo, в которой хранятся эквивалентные выражения (операторы), например — Group 1: (A join B) , (B join A). Optimization Task — дословно, задача оптимизации, это операция предпринимаемая оптимизатором в процессе поиска плана. Это может быть например, применение правила преобразования к узлу дерева операторов. Timeout — определенное количество задач оптимизации (Optimization Task), которое отводит себе оптимизатор перед тем, как начинает оптимизировать запрос, т.е. некий бюджет на количество преобразований. По мере выполнения преобразований оптимизатор смотрит на этот счетчик, и как только потратил всё отведенное количество — прекращает оптимизацию и выдает тот план, который у него есть на данный момент. Процесс оптимизации Оптимизация состоит из стадий: - тривиальный план - search 0 - search 1 - search 2 Каждая стадия характеризуется набором доступных операций оптимизации, входными условиями и т.д. От стадии к стадии набор приемов расширяется. Для отслеживания вариантов планов, на каждой стадии, оптимизатор заполняет структуру Memo в которой хранит группы эквивалентности. Конечное Memo предыдущей стадии используется как начальное для следующей. И от стадии к стадии число групп растет, сложность растет - таймаут тоже растет . Более того Мемо ведет своеобразный треккинг "лучшего" плана и отметает неэффективные ветки, от этого в частности зависит и величина таймаута (это можно проверить трейсфлагом). Но тем не менее, если только таймаут не отключен (хотя его нельзя полностью отключить, можно только сильно увеличить) - он задает некоторый лимит операций, за который оптимизатор не может выйти на определенной стадии. Если интересно, можно взять дебаггер, поставить брэйкпоинты на следующие методы: Код: sql 1. 2. 3. 4. 5.
После этого выполнить какой-нибудь запрос с таймаутом, (я взял пример из своего блога) и посмотреть, какие методы в какой последовательности вызываются. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
Результат: Код: sql 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.
Т.е. было пройдено две стадии полной оптимизации search0 (также известная как Transaction Processing) и search1 (известная как Quick Plan), начата стадия search2 известная как просто Full, т.е. полная оптимизация, но прежде чем на ней был найден достаточно хороший план - получен получен таймаут, когда число преобразований достигло 614400. Это отразилось в вызовах следующим образом (мои коменты зеленым): Также в процессе оптимизации есть много всяких эвристик, как в правилах преобразования, так и в выборе самих стадий и внутри стадий. Но - процесс оптимизации - это все равно программа. Если система не изменяется (не добавляются нове индексы, строки, статистика и т.д.) - то процесс получения плана идет одинаково от раза к разу. Нет такого, что "он начал перебор с конца" и по этому не нашел хороший план, а потом луна вошла в водолея, он начал перебор сначала и нашел хороший план. Это я утрирую конечно. Что касается вообще невозможности найти хороший план из-за таймаута - то такое может быть конечно, но это вряд ли выглядит как описал ТС. И даже если возникает таймаут - то первопричина не в самой концепции таймаута как таковой, а, в исходных условиях, в которые был поставлен оптимизатор, например, то же прослушивание параметров. В любом случае ведь проще сначала проверить распространенные причины, прежде чем лезть в дебри, имхо. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2013, 14:05 |
|
изменение плана со временем
|
|||
---|---|---|---|
#18+
SomewhereSomehow, Запрос только не тот запостил, таблиц нужно больше 5, чтоб до стадии 2 (Full) дошел процесс. Правильный запрос релевантный примеру. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2013, 14:19 |
|
изменение плана со временем
|
|||
---|---|---|---|
#18+
SomewhereSomehowaleks2, Не понял, к чему это вы? 1. Я к тому, что оптимизатор все ж, банально, перебирает разное число планов при перекомпиляциях. 2. И единственно правильный способ стабилизировать план - не давать оптимизатору никакого выбора. 3. А читать многабукав из твоих, возможно правильных, текстов - неразумно. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2013, 15:49 |
|
изменение плана со временем
|
|||
---|---|---|---|
#18+
aleks21. Я к тому, что оптимизатор все ж, банально, перебирает разное число планов при перекомпиляциях. 2. И единственно правильный способ стабилизировать план - не давать оптимизатору никакого выбора. 3. А читать многабукав из твоих, возможно правильных, текстов - неразумно. Много букв это да, смысл в их написании тут - был простой, показать, что банальный перебор идет не от желания левой пятки оптимизатора, а по определенным алгоритмам, и таймаут зависит не от нагрузки. Что касается стабильности - разное можно под этим понимать, можно стабильность (предсказуемость) выбора плана в зависимости от ситуации, имхо, в большинстве случаев это предпочтительнее, но может быть и некий усредненный план, пусть и не очень оптимальный для каждого конкретного случая, optimize for unknown не зря же придумали. Это смотря что надо ТС. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2013, 16:13 |
|
изменение плана со временем
|
|||
---|---|---|---|
#18+
SomewhereSomehowМного букв это да, смысл в их написании тут - был простой, показать, что банальный перебор идет не от желания левой пятки оптимизатора, а по определенным алгоритмам, и таймаут зависит не от нагрузки. Большой Вам респект за пример. Я всегда подозревал, что загрузка процессора ни коим образом не влияет на количество планов которые успеет перебрать оптимизатор, но все некогда было в этом покопаться. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2013, 20:16 |
|
|
start [/forum/topic.php?fid=46&msg=38413572&tid=1705136]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
191ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 306ms |
0 / 0 |