Sql-Server

我應該在非聚集索引中重建索引嗎?

  • May 31, 2021

我將在 SQL Server 中重建我們的索引,因為我們在所有表的所有索引上的碎片率都很​​高。我還應該包括重建我的非聚集索引嗎?還是重建聚集索引就足夠了?

謝謝!

在大多數情況下,您的非聚集索引是在處理某個查詢之後添加的,這對您的業務/應用程序可能非常重要。像往常一樣,答案是,它取決於使用索引的查詢的重要性(無論是集群在非集群上)。

如果可以,將數據庫恢復到開發伺服器,然後從https://ola.hallengren.com/downloads.html/執行 3 個 Ola Hallengren 腳本(IndexOptimize.sql、CommandExecute.sql 和 CommandLog.sql) 。

部署後,您可以例如執行此腳本。

EXECUTE dbo.IndexOptimize
   @Databases = 'ALL_Databases',
   @FragmentationLow = NULL,
   @FragmentationMedium = 'INDEX_REORGANIZE,INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
   @FragmentationHigh = 'INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
   @FragmentationLevel1 = 10,
   @FragmentationLevel2 = 30,
   @PartitionLevel = 'Y',
   @MaxDOP = 0,
   @UpdateStatistics = 'ALL',
   @OnlyModifiedStatistics = 'Y',
   @LogToTable = 'Y',
   @Indexes = 'ALL_INDEXES'

如果您對執行持續時間感到滿意,並且數據庫日誌沒有增長太多,請在允許的維護時段內將相同的部署與上述腳本一起執行到您的生產環境中。

除上述內容外,您還可以執行以下腳本來檢查索引在重組/重建之前的碎片化程度。

SELECT  [ID]
     , [StartTime]
     , [DatabaseName]
     , [ObjectName] = [SchemaName] + '.' + [ObjectName]
     , [IndexName]
     , [PartitionNumber]
     , [SizeMB] = ExtendedInfo.value('(/ExtendedInfo/PageCount)[1]', 'int') /128
     , Fragmentation = ExtendedInfo.value('(/ExtendedInfo/Fragmentation)[1]', 'decimal(10,1)')
     , [Duration(s)] = DATEDIFF(SECOND, [StartTime],[EndTime])
     , [Command]
FROM [dbo].[CommandLog]
WHERE CommandType NOT IN ('UPDATE_STATISTICS')          --only disply index defragmentation information
ORDER BY [StartTime]

引用自:https://dba.stackexchange.com/questions/292531