|
Эффект от перестроения индекса
|
|||
---|---|---|---|
#18+
Здравствуйте! Работаю на MS SQL 2017. Есть таблица на 8 300 000 строк. В нее никто никогда ничего не пишет. И только 1 процесс читает. На ней некластерный индекс, предложенный аналайзером. Вот такой: CREATE NONCLUSTERED INDEX [idx_pc2] ON [dbo].[tab_pos] ( [t_id] ASC, [p_id] ASC ) INCLUDE([num],[seg_num],[weight],[mask],[cnt]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = ON, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = OFF, ALLOW_PAGE_LOCKS = OFF) ON [PRIMARY] Есть запрос, вызывающий через outer apply функцию, читающую эту таблицу. Он работает продолжительное время. Время однократной отработки функции 150-200 мс. Смотрю по логирующей таблице и по профайлеру. Через 40 минут работы (~14000 вызовов) резко падает производительность до 800-1200 мс. Если процесс остановить и продолжить - производительность остается неудовлетворительной. Если посмотреть на указанный индекс, то по нему фрагментация показана 0,012. Если индекс "Перестроить" через менюшку и запустить процесс снова, то производительность ВОССТАНАВЛИВАЕТСЯ. Но фрагментация не меняется. Что при низкой, что при высокой производительности фрагментация 0,01 - 0,02. Пробовал читать эту таблицу (NOLOCK) - никаких изменений не заметил. По дисковым операциям в журналах ничего не заметил. По графику загрузки диска - 3%. Диск samsung 980 pro М.2 Файл базы 20 Г, лог - 4 Г. Выделены статически с большим запасом. Что там портится? И почему так быстро? :( Можно как-нить зафиксировать таблицу и индексы в стабильном состоянии? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 01:59 |
|
Эффект от перестроения индекса
|
|||
---|---|---|---|
#18+
попробуйте не перестраивать индекс, а обновить статистику. По симптомам похоже на параметр сниффинг. Перестройка индекса или обновление статистики просто сбрасывает запомненный план в результате новогенеренный будет оптимальным. https://www.brentozar.com/archive/2013/06/the-elephant-and-the-mouse-or-parameter-sniffing-in-sql-server/ ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 04:40 |
|
Эффект от перестроения индекса
|
|||
---|---|---|---|
#18+
Еще ссылок про прослушивание параметров. https://sql-ex.ru/blogs/?/Pochemu_Parameter_Sniffing_ne_vsegda_ploho_hotJa_obychno_tak_i_est.html http://www.queryprocessor.ru/disable_parameter_sniffing/ фрагментация не в кассу совсем, на мой взгляд, как и диски. Нужны планы выполнения быстрые и медленные. Снять их тоже не просто (если профайлер будет писать план для каждого из 14000 вызовов то он завесит все) Пересбор статистики делать как UPDATE STATISTICS [dbo].[tab_pos] Это безопасно, быстро, дешево, практично и в общем не нужно ибо только инвалидирует план. Фунции - зло. Лучше переписать на банальные джойны. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 06:14 |
|
Эффект от перестроения индекса
|
|||
---|---|---|---|
#18+
Можно просто через sp_recompile дать команду на рекомпиляцию, чтоб наверняка, так сказать. Функция табличная? Если есть возможность, то на inline попробуйте её переделать. Ну или просто её переписать/усилить, чтобы план был получше и не съезжал никуда. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 09:48 |
|
Эффект от перестроения индекса
|
|||
---|---|---|---|
#18+
Lopez78, у вас единственный индекс на таблие (куче)? Если есть возможность, покажите "быстрый" и "медленный" планы. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 12:13 |
|
Эффект от перестроения индекса
|
|||
---|---|---|---|
#18+
komrad Если есть возможность, покажите "быстрый" и "медленный" планы. Только актуальные и не картинками. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 12:15 |
|
Эффект от перестроения индекса
|
|||
---|---|---|---|
#18+
Спасибо всем! Индекс не единственный, их там шесть. Перестроение одного используемого в плане приносит облегчение. 1. Дождался деградации - снял план. 2. update statistics [42AF9C90-8B3C-454E-9FAA-4C0C4D1485BE_pos] - не имеет никакого эффекта. 3. Пересторил индекс - снял план. Они огромные, я xml не буду приводить. А картинку - простите :) План сильно меняется. На медленном плане практически везде неверное предполагаемое число строк. После перестроения индекса оно исправляется для нужной таблицы, но потом портится опять. Кроме того, используются две временные таблицы - для обеих изменения в плане вызывают сильную деградацию. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 14:36 |
|
Эффект от перестроения индекса
|
|||
---|---|---|---|
#18+
Lopez78После перестроения индекса оно исправляется для нужной таблицы, но потом портится опять. Кроме того, используются две временные таблицы - для обеих изменения в плане вызывают сильную деградацию. при перестройке индекса статистика по индексированному полю обновляется с fullscan (100%) в случае обновления вашей командой, используется автоматический семплинг (проценты от таблицы) кроме того судя по картинке, у вас не временные таблицы, а табличные переменные в этом случае оптимизатор использует другие ожидания, нежели в случае настоящих временных таблиц попробуйте переписать запрос на временные таблицы ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 14:43 |
|
Эффект от перестроения индекса
|
|||
---|---|---|---|
#18+
не понимаю, зачем перестраивать индекс для таблицы, которая НИКОГДА не меняется ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 14:52 |
|
Эффект от перестроения индекса
|
|||
---|---|---|---|
#18+
Верно, табличные переменные. Там еще есть передача их через параметры. И внутри функций нельзя создавать/дропать временные таблицы. Перестраивание индекса таблицы, которая не меняется - это лекарство, найденное случайно. И казалось, что оно помогает, но косвенно. EXEC sp_recompile N'[dbo].[42AF9C90-8B3C-454E-9FAA-4C0C4D1485BE_pos]' Вот помогло! Улучшился даже "хороший" план :)) Причем, указываю имя таблицы, а не деградирующей функции. Всем спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 15:01 |
|
Эффект от перестроения индекса
|
|||
---|---|---|---|
#18+
Lopez78 Вот помогло! Улучшился даже "хороший" план :)) Причем, указываю имя таблицы, а не деградирующей функции. Так называемая "рекомпиляция" таблицы вызывает рекомпиляцию всех объектов, работающих с ней. Полагаю, проблема вернется. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 15:08 |
|
Эффект от перестроения индекса
|
|||
---|---|---|---|
#18+
Думаю, рекомпиляция всех объектов, связанных с таблицей - грубое решение. Мне же нужен был конкретный план. Поставил OPTION(RECOMPILE) на исследуемый запрос. Вроде проблема пока не проявляется. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 17:24 |
|
Эффект от перестроения индекса
|
|||
---|---|---|---|
#18+
Lopez78 Думаю, рекомпиляция всех объектов, связанных с таблицей - грубое решение. Мне же нужен был конкретный план. Поставил OPTION(RECOMPILE) на исследуемый запрос. Вроде проблема пока не проявляется. Тогда вообще не понимаю... Если был хороший план, и он был зафиксирован, то почему он однажды превращается в плохой навсегда? А если он теперь перекомпилируется все время - то почему он все время хороший (т.е. исходный)? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 17:35 |
|
Эффект от перестроения индекса
|
|||
---|---|---|---|
#18+
Lopez78 Если был хороший план, и он был зафиксирован, то почему он однажды превращается в плохой навсегда? что значит зафиксирован? в случае использования параметров, план генерируется под первые переданные значения из-за разной селективности данных, этот план будет оптимальным не для всех возможных параметров Lopez78А если он теперь перекомпилируется все время - то почему он все время хороший (т.е. исходный)? в данном случае, план строится под конкретные переданные параметры на самом деле план не одинаковый, он отличается для разных наборов параметров ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 17:46 |
|
Эффект от перестроения индекса
|
|||
---|---|---|---|
#18+
>Тогда вообще не понимаю.. Перевод подробнейшей статьи Erland Sommarskog для лучшего понимания http://sqlcom.ru/dba-tools/sql-server-management-studio-optimization-part-1/ http://sqlcom.ru/dba-tools/sql-server-management-studio-optimization-part-2/ http://sqlcom.ru/dba-tools/sql-server-management-studio-optimization-part-3/ ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 17:47 |
|
Эффект от перестроения индекса
|
|||
---|---|---|---|
#18+
komrad, Верхний план (на картинке) хороший. Но в какой-то момент во время длительного процесса он изменится на нижний плохой (минимум в 5 раз дольше. То, что там 400мс против 700мс - это только один запрос) . И все время будет плохой до перекомпиляции (перестроения индекса). Выполнил одну итерацию в отладке - увидел плохой план. Пустил весь объем - он весь пройдет по плохому плану с плохим временем. Он даже случайно не даст хороший результат на каких-то особенных данных. Перестроил, выполнил одну итерацию - увидел хороший план. Пустил весь объем (те же самые данные) - он идет по хорошему плану 40 минут. А потом жопа. Смотрю одну итерацию - плохой план. Включил перекомпиляцию. Везде хорошее время. Останавливаю в любой момент, даю одну итерацию - верхний план. :( SERG1257, спасибо, буду изучать ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 19:14 |
|
Эффект от перестроения индекса
|
|||
---|---|---|---|
#18+
Lopez78 Но в какой-то момент во время длительного процесса он изменится на нижний плохой (минимум в 5 раз дольше. То, что там 400мс против 700мс - это только один запрос) . И все время будет плохой до перекомпиляции (перестроения индекса). На втором плане обратите внимание на underestimation 1 против 22230 и 502399 против 39. На это тратится лишнее время и I/O. Не знаю, какая у вас версия сиквела, но до последнего времени (sql2019?) оптимизатор считал, что в @-таблице одна запись. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 20:40 |
|
Эффект от перестроения индекса
|
|||
---|---|---|---|
#18+
komrad Не знаю, какая у вас версия сиквела, но до последнего времени (sql2019?) оптимизатор считал, что в @-таблице одна запись. Option (recompile), кстати, даёт возможность оптимизатору узнать сколько же там строк, и estimate будет правильный. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 21:29 |
|
Эффект от перестроения индекса
|
|||
---|---|---|---|
#18+
4es Option (recompile), кстати, даёт возможность оптимизатору узнать сколько же там строк , и estimate будет правильный. есть где про это почитать (пруф)? про SQL2019 и @-таблицы: https://www.brentozar.com/archive/2018/09/sql-server-2019-faster-table-variables-and-new-parameter-sniffing-issues/ ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 21:52 |
|
Эффект от перестроения индекса
|
|||
---|---|---|---|
#18+
komrad есть где про это почитать (пруф)? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 22:08 |
|
Эффект от перестроения индекса
|
|||
---|---|---|---|
#18+
Lopez78 Они огромные, я xml не буду приводить. А картинку - простите :)А зря не приводите План его засунуть сюда https://www.brentozar.com/pastetheplan/ И опубликовать ссылку здесь ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 22:15 |
|
Эффект от перестроения индекса
|
|||
---|---|---|---|
#18+
Lopez78, авторПерестраивание индекса таблицы, которая не меняется - это лекарство, найденное случайно. Ага, мумбо-юмбо. При перестроении индекса удаются планы запроса из кэша. Не надо ничего перестраивать, используйте recompile подсказку, чтобы планы не сохранялись. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 10:50 |
|
Эффект от перестроения индекса
|
|||
---|---|---|---|
#18+
invm komrad есть где про это почитать (пруф)? спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 12:31 |
|
|
start [/forum/topic.php?fid=46&fpage=38&tid=1685266]: |
0ms |
get settings: |
7ms |
get forum list: |
10ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
53ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 162ms |
0 / 0 |