У меня есть хранимая процедура, которая извлекает индексы с высокой фрагментацией с учетом порога фрагментации @FragmentationThresholdForReorganizeTableLowerLimit:
SELECT OBJECT_NAME(IPS.OBJECT_ID) AS [TableName],
avg_fragmentation_in_percent, SI.name [IndexName],
schema_name(ST.schema_id) AS [SchemaName], fill_factor
FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL , NULL) IPS
JOIN sys.tables ST WITH (nolock) ON IPS.OBJECT_ID = ST.OBJECT_ID
JOIN sys.indexes SI WITH (nolock) ON IPS.OBJECT_ID = SI.OBJECT_ID AND
IPS.index_id = SI.index_id
WHERE ST.is_ms_shipped = 0
AND SI.name IS NOT NULL
AND avg_fragmentation_in_percent >= CONVERT(DECIMAL, @FragmentationThresholdForReorganizeTableLowerLimit)
ORDER BY avg_fragmentation_in_percent DESC
В моем случае @FragmentationThresholdForReorganizeTableLowerLimit имеет значение 5.0.
Затем я перебираю все извлеченные индексы и, в зависимости от значения avg_fragmentation_in_percent, выполняю REORGANIZE или REBUILD, используя следующие команды:
ALTER INDEX [IndexName] ON [SchemaName].[Table] REORGANIZE
ALTER INDEX [IndexName] ON [SchemaName].[Table] REBUILD WITH (FILLFACTOR = 100, STATISTICS_NORECOMPUTE = OFF)
После выполнения вышеуказанных операций, если я выполню запрос ниже, чтобы найти средний процент фрагментации для всех индексов, я вижу, что индексы типа HEAP не были реорганизованы / перестроены:
SELECT a.index_id, name, avg_fragmentation_in_percent, index_type_desc
FROM sys.dm_db_index_physical_stats (DB_ID(),
NULL, NULL, NULL, NULL) AS a
JOIN sys.indexes AS b
ON a.object_id = b.object_id AND a.index_id = b.index_id
WHERE avg_fragmentation_in_percent > '5.0'
ORDER BY a.avg_fragmentation_in_percent desc;
GO
Ниже снимка экрана, показывающего вывод запроса:
Так почему же индексы кучи не реорганизуются / не перестраиваются? Как я могу реорганизовать или перестроить их, чтобы устранить их фрагментацию?
UPDATE :
Извините за мою ошибку, на самом деле я не перестраиваю индексы кучи, потому что я отбрасываю их при использовании условия "AND SI.name IS NOT NULL" в предложении where ....
Так что в случае индексов кучи, так как их имя NULL, как я могу ссылаться на них, чтобы перестроить их?