Dwightqwerty Asked: 2021-06-01 02:51:01 +0800 CST2021-06-01 02:51:01 +0800 CST 2021-06-01 02:51:01 +0800 CST 我应该在非聚集索引中重建索引吗? 772 我将在 SQL Server 中重建我们的索引,因为我们在所有表的所有索引上的碎片率都很高。我还应该包括重建我的非聚集索引吗?还是重建聚集索引就足够了? 谢谢! sql-server clustered-index 1 个回答 Voted Best Answer Thor Van Der Merwe 2021-06-01T04:02:40+08:002021-06-01T04:02:40+08:00 在大多数情况下,您的非聚集索引是在处理某个查询之后添加的,这对您的业务/应用程序可能非常重要。像往常一样,答案是,它取决于使用索引的查询的重要性(无论是集群在非集群上)。 如果可以,将数据库恢复到开发服务器,然后从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://ola.hallengren.com/downloads.html/运行 3 个 Ola Hallengren 脚本(IndexOptimize.sql、CommandExecute.sql 和 CommandLog.sql) 。
部署后,您可以例如运行此脚本。
如果您对运行持续时间感到满意,并且数据库日志没有增长太多,请在允许的维护时段内将相同的部署与上述脚本一起运行到您的生产环境中。
除上述内容外,您还可以运行以下脚本来检查索引在重组/重建之前的碎片化程度。