sql – 基于碎片结果自动化INDEX重建?
发布时间:2020-12-12 16:43:49 所属栏目:MsSql教程 来源:网络整理
导读:是否可以添加维护作业来检查索引碎片.如果大于50%,那么会自动重建这些索引? 索引大小可以从100MB到10GB不等. SQL 2005. 谢谢. 解决方法 我使用这个脚本.请注意,我建议您阅读我在这里使用的dmv,它们是SQL2005中的隐藏的宝石. SET TRANSACTION ISOLATION LEVE
是否可以添加维护作业来检查索引碎片.如果大于50%,那么会自动重建这些索引?
索引大小可以从100MB到10GB不等. 谢谢. 解决方法我使用这个脚本.请注意,我建议您阅读我在这里使用的dmv,它们是SQL2005中的隐藏的宝石.SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED CREATE TABLE #FragmentedIndexes ( DatabaseName SYSNAME,SchemaName SYSNAME,TableName SYSNAME,IndexName SYSNAME,[Fragmentation%] FLOAT ) INSERT INTO #FragmentedIndexes SELECT DB_NAME(DB_ID()) AS DatabaseName,ss.name AS SchemaName,OBJECT_NAME (s.object_id) AS TableName,i.name AS IndexName,s.avg_fragmentation_in_percent AS [Fragmentation%] FROM sys.dm_db_index_physical_stats(db_id(),NULL,'SAMPLED') s INNER JOIN sys.indexes i ON s.[object_id] = i.[object_id] AND s.index_id = i.index_id INNER JOIN sys.objects o ON s.object_id = o.object_id INNER JOIN sys.schemas ss ON ss.[schema_id] = o.[schema_id] WHERE s.database_id = DB_ID() AND i.index_id != 0 AND s.record_count > 0 AND o.is_ms_shipped = 0 DECLARE @RebuildIndexesSQL NVARCHAR(MAX) SET @RebuildIndexesSQL = '' SELECT @RebuildIndexesSQL = @RebuildIndexesSQL + CASE WHEN [Fragmentation%] > 30 THEN CHAR(10) + 'ALTER INDEX ' + QUOTENAME(IndexName) + ' ON ' + QUOTENAME(SchemaName) + '.' + QUOTENAME(TableName) + ' REBUILD;' WHEN [Fragmentation%] > 10 THEN CHAR(10) + 'ALTER INDEX ' + QUOTENAME(IndexName) + ' ON ' + QUOTENAME(SchemaName) + '.' + QUOTENAME(TableName) + ' REORGANIZE;' END FROM #FragmentedIndexes WHERE [Fragmentation%] > 10 DECLARE @StartOffset INT DECLARE @Length INT SET @StartOffset = 0 SET @Length = 4000 WHILE (@StartOffset < LEN(@RebuildIndexesSQL)) BEGIN PRINT SUBSTRING(@RebuildIndexesSQL,@StartOffset,@Length) SET @StartOffset = @StartOffset + @Length END PRINT SUBSTRING(@RebuildIndexesSQL,@Length) EXECUTE sp_executesql @RebuildIndexesSQL DROP TABLE #FragmentedIndexes 还要记住,这个脚本可以运行一段时间,并阻止访问你的表.除非有企业版SQL可以在重建索引时锁定表.这将使用索引阻止对该表的所有查询,直到索引碎片整理完成.因此,不建议在维护窗口期间在运行时间内运行索引重建.如果您正在运行企业版,您可以使用ONLINE = ON选项来在线整理索引.这将使用更多的空间,但在碎片整理操作期间不会阻止/锁定您的表. 如果您需要更多信息,请发出提示. 更新: 如果您在较小的数据库上运行此查询,则可以在调用sys.dm_db_index_physical_stats时使用’DETAILED’参数.这可能是对这些指标的更详细的检查.评论中的讨论还将指出,在更大的表格上,可能值得进行SAMPLED扫描,因为这将有助于减少进行索引扫描所需的时间. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |