Реорганизация или перестройка индексов кучи SQL Server - PullRequest
0 голосов
/ 30 июня 2019

У меня есть хранимая процедура, которая извлекает индексы с высокой фрагментацией с учетом порога фрагментации @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

Ниже снимка экрана, показывающего вывод запроса:

enter image description here

Так почему же индексы кучи не реорганизуются / не перестраиваются? Как я могу реорганизовать или перестроить их, чтобы устранить их фрагментацию?

UPDATE : Извините за мою ошибку, на самом деле я не перестраиваю индексы кучи, потому что я отбрасываю их при использовании условия "AND SI.name IS NOT NULL" в предложении where ....

Так что в случае индексов кучи, так как их имя NULL, как я могу ссылаться на них, чтобы перестроить их?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...