powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Эффект от перестроения индекса
24 сообщений из 24, страница 1 из 1
Эффект от перестроения индекса
    #40025833
Lopez78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

Работаю на 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 Г. Выделены статически с большим запасом.


Что там портится? И почему так быстро? :(
Можно как-нить зафиксировать таблицу и индексы в стабильном состоянии?
...
Рейтинг: 0 / 0
Эффект от перестроения индекса
    #40025841
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуйте не перестраивать индекс, а обновить статистику.
По симптомам похоже на параметр сниффинг.
Перестройка индекса или обновление статистики просто сбрасывает запомненный план в результате новогенеренный будет оптимальным.

https://www.brentozar.com/archive/2013/06/the-elephant-and-the-mouse-or-parameter-sniffing-in-sql-server/
...
Рейтинг: 0 / 0
Эффект от перестроения индекса
    #40025846
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще ссылок про прослушивание параметров.
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]

Это безопасно, быстро, дешево, практично и в общем не нужно ибо только инвалидирует план.

Фунции - зло. Лучше переписать на банальные джойны.
...
Рейтинг: 0 / 0
Эффект от перестроения индекса
    #40025870
4es
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
4es
Гость
Можно просто через sp_recompile дать команду на рекомпиляцию, чтоб наверняка, так сказать.
Функция табличная? Если есть возможность, то на inline попробуйте её переделать.
Ну или просто её переписать/усилить, чтобы план был получше и не съезжал никуда.
...
Рейтинг: 0 / 0
Эффект от перестроения индекса
    #40025900
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lopez78,
у вас единственный индекс на таблие (куче)?
Если есть возможность, покажите "быстрый" и "медленный" планы.
...
Рейтинг: 0 / 0
Эффект от перестроения индекса
    #40025903
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
komrad
Если есть возможность, покажите "быстрый" и "медленный" планы.
+1

Только актуальные и не картинками.
...
Рейтинг: 0 / 0
Эффект от перестроения индекса
    #40025941
Lopez78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем!

Индекс не единственный, их там шесть. Перестроение одного используемого в плане приносит облегчение.

1. Дождался деградации - снял план.

2. update statistics [42AF9C90-8B3C-454E-9FAA-4C0C4D1485BE_pos] - не имеет никакого эффекта.

3. Пересторил индекс - снял план.

Они огромные, я xml не буду приводить. А картинку - простите :)
План сильно меняется. На медленном плане практически везде неверное предполагаемое число строк.
После перестроения индекса оно исправляется для нужной таблицы, но потом портится опять.
Кроме того, используются две временные таблицы - для обеих изменения в плане вызывают сильную деградацию.
...
Рейтинг: 0 / 0
Эффект от перестроения индекса
    #40025943
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lopez78После перестроения индекса оно исправляется для нужной таблицы, но потом портится опять.
Кроме того, используются две временные таблицы - для обеих изменения в плане вызывают сильную деградацию.

при перестройке индекса статистика по индексированному полю обновляется с fullscan (100%)
в случае обновления вашей командой, используется автоматический семплинг (проценты от таблицы)

кроме того судя по картинке, у вас не временные таблицы, а табличные переменные
в этом случае оптимизатор использует другие ожидания, нежели в случае настоящих временных таблиц

попробуйте переписать запрос на временные таблицы
...
Рейтинг: 0 / 0
Эффект от перестроения индекса
    #40025944
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не понимаю, зачем перестраивать индекс для таблицы, которая НИКОГДА не меняется
...
Рейтинг: 0 / 0
Эффект от перестроения индекса
    #40025946
Lopez78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Верно, табличные переменные. Там еще есть передача их через параметры. И внутри функций нельзя создавать/дропать временные таблицы.

Перестраивание индекса таблицы, которая не меняется - это лекарство, найденное случайно. И казалось, что оно помогает, но косвенно.

EXEC sp_recompile N'[dbo].[42AF9C90-8B3C-454E-9FAA-4C0C4D1485BE_pos]'

Вот помогло! Улучшился даже "хороший" план :))
Причем, указываю имя таблицы, а не деградирующей функции.

Всем спасибо!
...
Рейтинг: 0 / 0
Эффект от перестроения индекса
    #40025950
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lopez78

Вот помогло! Улучшился даже "хороший" план :))
Причем, указываю имя таблицы, а не деградирующей функции.

Так называемая "рекомпиляция" таблицы вызывает рекомпиляцию всех объектов, работающих с ней.
Полагаю, проблема вернется.
...
Рейтинг: 0 / 0
Эффект от перестроения индекса
    #40026033
Lopez78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Думаю, рекомпиляция всех объектов, связанных с таблицей - грубое решение. Мне же нужен был конкретный план.
Поставил OPTION(RECOMPILE) на исследуемый запрос. Вроде проблема пока не проявляется.
...
Рейтинг: 0 / 0
Эффект от перестроения индекса
    #40026044
Lopez78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lopez78
Думаю, рекомпиляция всех объектов, связанных с таблицей - грубое решение. Мне же нужен был конкретный план.
Поставил OPTION(RECOMPILE) на исследуемый запрос. Вроде проблема пока не проявляется.


Тогда вообще не понимаю...

Если был хороший план, и он был зафиксирован, то почему он однажды превращается в плохой навсегда?
А если он теперь перекомпилируется все время - то почему он все время хороший (т.е. исходный)?
...
Рейтинг: 0 / 0
Эффект от перестроения индекса
    #40026050
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lopez78

Если был хороший план, и он был зафиксирован, то почему он однажды превращается в плохой навсегда?

что значит зафиксирован?
в случае использования параметров, план генерируется под первые переданные значения
из-за разной селективности данных, этот план будет оптимальным не для всех возможных параметров

Lopez78А если он теперь перекомпилируется все время - то почему он все время хороший (т.е. исходный)?
в данном случае, план строится под конкретные переданные параметры
на самом деле план не одинаковый, он отличается для разных наборов параметров
...
Рейтинг: 0 / 0
Эффект от перестроения индекса
    #40026052
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Тогда вообще не понимаю..
Перевод подробнейшей статьи 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/
...
Рейтинг: 0 / 0
Эффект от перестроения индекса
    #40026096
Lopez78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
komrad,

Верхний план (на картинке) хороший. Но в какой-то момент во время длительного процесса он изменится на нижний плохой (минимум в 5 раз дольше. То, что там 400мс против 700мс - это только один запрос) . И все время будет плохой до перекомпиляции (перестроения индекса).

Выполнил одну итерацию в отладке - увидел плохой план.
Пустил весь объем - он весь пройдет по плохому плану с плохим временем.
Он даже случайно не даст хороший результат на каких-то особенных данных.

Перестроил, выполнил одну итерацию - увидел хороший план.
Пустил весь объем (те же самые данные) - он идет по хорошему плану 40 минут.
А потом жопа. Смотрю одну итерацию - плохой план.

Включил перекомпиляцию. Везде хорошее время. Останавливаю в любой момент, даю одну итерацию - верхний план. :(

SERG1257,
спасибо, буду изучать
...
Рейтинг: 0 / 0
Эффект от перестроения индекса
    #40026122
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lopez78
Но в какой-то момент во время длительного процесса он изменится на нижний плохой (минимум в 5 раз дольше. То, что там 400мс против 700мс - это только один запрос) . И все время будет плохой до перекомпиляции (перестроения индекса).

На втором плане обратите внимание на underestimation 1 против 22230 и 502399 против 39.
На это тратится лишнее время и I/O.

Не знаю, какая у вас версия сиквела, но до последнего времени (sql2019?) оптимизатор считал, что в @-таблице одна запись.
...
Рейтинг: 0 / 0
Эффект от перестроения индекса
    #40026132
4es
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
4es
Гость
komrad
Не знаю, какая у вас версия сиквела, но до последнего времени (sql2019?) оптимизатор считал, что в @-таблице одна запись.

Option (recompile), кстати, даёт возможность оптимизатору узнать сколько же там строк, и estimate будет правильный.
...
Рейтинг: 0 / 0
Эффект от перестроения индекса
    #40026140
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4es

Option (recompile), кстати, даёт возможность оптимизатору узнать сколько же там строк , и estimate будет правильный.

есть где про это почитать (пруф)?

про SQL2019 и @-таблицы:
https://www.brentozar.com/archive/2018/09/sql-server-2019-faster-table-variables-and-new-parameter-sniffing-issues/
...
Рейтинг: 0 / 0
Эффект от перестроения индекса
    #40026150
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
komrad
есть где про это почитать (пруф)?
https://docs.microsoft.com/en-us/archive/blogs/psssql/query-performance-and-table-variables
...
Рейтинг: 0 / 0
Эффект от перестроения индекса
    #40026153
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lopez78 Они огромные, я xml не буду приводить. А картинку - простите :)А зря не приводите
План его засунуть сюда
https://www.brentozar.com/pastetheplan/
И опубликовать ссылку здесь
...
Рейтинг: 0 / 0
Эффект от перестроения индекса
    #40026279
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lopez78,

авторПерестраивание индекса таблицы, которая не меняется - это лекарство, найденное случайно.

Ага, мумбо-юмбо. При перестроении индекса удаются планы запроса из кэша. Не надо ничего перестраивать, используйте recompile подсказку, чтобы планы не сохранялись.
...
Рейтинг: 0 / 0
Эффект от перестроения индекса
    #40026318
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
komrad
есть где про это почитать (пруф)?
https://docs.microsoft.com/en-us/archive/blogs/psssql/query-performance-and-table-variables

спасибо!
...
Рейтинг: 0 / 0
Эффект от перестроения индекса
    #40030003
Idol_111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вставьте хинт HASH на конкретно этот join. Похоже это будет для вас самое простое и быстрое решение.
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Эффект от перестроения индекса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]