Столкнулся с непонятной ситуацией. В планах обслуживания у меня настроена ежедневная реиндексация со следующими параметрами:
- Перестроение, если процент фрагментации > 30
- Реорганизация, если процент фрагментации > 5.
Обратил внимание, на огромный размер бэкапа журнала транзакций после реиндексации. Запустил скрипт, показывающий процент фрагментации. И он показал, что по ряду индексов фрагментация больше 20 (через несколько часов после ночной реиндексации), в том числе по таким большим таблицам, как регистры СебестоимостьТоваров и ТоварыОрганизации. В них явно не пишутся данные с такой интенсивностью, чтобы вызывать фрагментацию. В чем может быть дело?
Диски SSD. В статье на Хабре написано, что для SSD дисков частая реиндексация не нужна, и пороговые значения процента фрагментации можно делать выше. Кто какие настройки использует?
https://habr.com/ru/post/576882/
Скрипт реиндексации
USE ERP_WORK;
DECLARE @SQL NVARCHAR(MAX)
DECLARE cur CURSOR LOCAL READ_ONLY FORWARD_ONLY FOR
SEL ECT '
ALT ER INDEX [' + i.name + N'] ON [' + SCHEMA_NAME(o.[schema_id]) + '].[' + o.name + '] ' +
CASE WHEN s.avg_fragmentation_in_percent > 60
THEN 'REBUILD WITH (SORT_IN_TEMPDB = ON'
-- Enterprise, Developer
+ CASE WHEN SERVERPROPERTY('EditionID') IN (1804890536, -2117995310)
THEN ', ON LINE = ON'
ELSE ''
END + ') --' + str(s.avg_fragmentation_in_percent)
ELSE 'REORGANIZE --' + str(s.avg_fragmentation_in_percent)
END + ';'
FR OM (
SEL ECT
s.[object_id]
, s.index_id
, avg_fragmentation_in_percent = MAX(s.avg_fragmentation_in_percent)
FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'DETAILED') s --'' LIMITED DETAILED
WH ERE s.page_count > 128 -- > 1 MB
AND s.index_id > 0 -- <> HEAP
AND s.avg_fragmentation_in_percent > 30
GROUP BY s.[object_id], s.index_id
) s
JOIN sys.indexes i WITH(NOLOCK) ON s.[object_id] = i.[object_id] AND s.index_id = i.index_id
JOIN sys.objects o WITH(NOLOCK) ON o.[object_id] = s.[object_id]
Диски SSD. В статье на Хабре написано, что для SSD дисков частая реиндексация не нужна, и пороговые значения процента фрагментации можно делать выше. Кто какие настройки использует?
В принципе да, на ssd фрагментация не так критична. Слышал рекомендации ставить порогом 30% и 80%, но с ходу не найду сейчас где именно.
Такая частая реиндексация, как у вас, выглядит перебором. Как правило раза в неделю достаточно, плюс ежедневное обновление статистики
1. Причем тут SSD диски и дефрагментация? Хотите из быстрых получать данные помедленней?
2. Тщательно не смотрел, может ошибаюсь или вы, вообще привели некий рекомендуемый скрипт, вместо своего, но сдается, что where ... AND s.avg_fragmentation_in_percent > 30 никак не согласуется с утверждением "
- Реорганизация, если процент фрагментации > 5.
а
CASE WHEN s.avg_fragmentation_in_percent > 60
THEN 'REBUILD
с утверждением - Перестроение, если процент фрагментации > 30
Т.е. по сути (если не ошибся в чтении скрипта), получаем, что индексы с фрагментацией менее 30, вообще у вас не обрабатываются, отсюда и возможно разгадка "что по ряду индексов фрагментация больше 20 "
3. В общем, кто на ком стоял я точно не понял, но если сразу после ночи процент фрагментации индексов СебестоимостьТоваров и ТоварыОрганизации стремится к нулю, то напрашивается совет - помониторить вашим скриптом и понять в какой момент все начинается.
Вы почитайте комментарии по своей ссылке. Там многое объясняется. В том числе и то, что разница между случайным и последовательны чтением есть, и немалая, и на SSD.
Да и про упреждающее чтение, которое, вероятно, не будет работать на сильно фрагментированных индексах автор тоже "забыл".
Заодно и "забыл", что оптимизатор имеет дело с логической структурой индексов, отсюда и план выполнения запросов может отличаться драматически. И сбор статистики, особенно частичной, может не выручить.
В общем-то, вопрос интересный. Если есть желание, можете поставить себе SSD диски, RAID контроллер, залить туда реальную базу и поиграться и без рэйда и с разными видами оного, заодно и свою статью напишите "за" или "против".
Безотносительно к вышесказанному, сильная фрагментация за короткое время - это плохо не только с точки зрения производительности. Если этого явно не ожидается, то надо разбираться, а что вообще такого пишется в эти таблицы и почему. Если же так и должно быть, то попробуйте поиграться с fill factor.