使用 DBCC SHOWCONTIG 和 DBCC DBREINDEX 对数据库中的索引进行碎片整理

本文提供了一段SQL Server数据库脚本,用于检查并自动修复数据库中的索引碎片。通过定义最大允许的碎片比例,该脚本可以找出超过这个比例的所有索引,并使用DBCC SHOWCONTIG和DBCC DBREINDEX命令来重新组织这些索引。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

--使用 DBCC SHOWCONTIG 和 DBCC DBREINDEX 对数据库中的索引进行碎片整理

-- Declare variables
SET NOCOUNT ON
DECLARE @tablename VARCHAR (128)
DECLARE @execstr   VARCHAR (255)
DECLARE @objectid  INT
DECLARE @indexid   INT
DECLARE @frag      DECIMAL
DECLARE @maxfrag   DECIMAL

--所能允许的最大碎片程度
SELECT @maxfrag = 10.0

-- 定义所有用户表的游标
DECLARE cur_tables CURSOR FOR
   SELECT TABLE_NAME
   FROM INFORMATION_SCHEMA.TABLES
   WHERE TABLE_TYPE = 'BASE TABLE'

-- Create the table
CREATE TABLE #fraglist (
   ObjectName CHAR (255),
   ObjectId INT,
   IndexName CHAR (255),
   IndexId INT,
   Lvl INT,
   CountPages INT,
   CountRows INT,
   MinRecSize INT,
   MaxRecSize INT,
   AvgRecSize INT,
   ForRecCount INT,
   Extents INT,
   ExtentSwitches INT,
   AvgFreeBytes INT,
   AvgPageDensity INT,
   ScanDensity DECIMAL,
   BestCount INT,
   ActualCount INT,
   LogicalFrag DECIMAL,
   ExtentFrag DECIMAL)

-- Open the cursor
OPEN cur_tables

-- Loop through all the cur_tables in the database
FETCH NEXT
   FROM cur_tables
   INTO @tablename

WHILE @@FETCH_STATUS = 0
BEGIN
-- Do the showcontig of all cur_indexes of the table
   INSERT INTO #fraglist
   EXEC ('DBCC SHOWCONTIG (''' + @tablename + ''')
      WITH FAST, TABLERESULTS, NO_INFOMSGS')
   FETCH NEXT
      FROM cur_tables
      INTO @tablename
END

-- Close and deallocate the cursor
CLOSE cur_tables
DEALLOCATE cur_tables

-- 定义需要重建索引的表的游标
DECLARE cur_indexes CURSOR FOR
   SELECT ObjectName, ObjectId, IndexId, LogicalFrag
   FROM #fraglist
   WHERE LogicalFrag >= @maxfrag
      --AND INDEXPROPERTY (ObjectId, IndexName, 'IndexDepth') > 0

-- Open the cursor
OPEN cur_indexes

-- loop through the cur_indexes
FETCH NEXT
   FROM cur_indexes
   INTO @tablename, @objectid, @indexid, @frag

WHILE @@FETCH_STATUS = 0
BEGIN
   PRINT 'Executing DBCC DBREINDEX (' + RTRIM(@tablename) + ') - fragmentation currently '
       + RTRIM(CONVERT(varchar(15),@frag)) + '%'
   SELECT @execstr = 'DBCC DBREINDEX(' + RTRIM(@tablename) + ')'
   EXEC (@execstr)

   FETCH NEXT
      FROM cur_indexes
      INTO @tablename, @objectid, @indexid, @frag
END

-- Close and deallocate the cursor
CLOSE cur_indexes
DEALLOCATE cur_indexes

-- Delete the temporary table
DROP TABLE #fraglist
GO

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值