您的位置:首页 > 其它

微软MSDN提供的索引碎片整理脚本

2013-07-26 10:39 113 查看
/*Perform a 'USE <database name>' to select the database in which to run the script.*/

-- Declare variables

SET NOCOUNT ON;

DECLARE @tablename varchar(255);

DECLARE @execstr   varchar(400);

DECLARE @objectid  int;

DECLARE @indexid   int;

DECLARE @frag      decimal;

DECLARE @maxfrag   decimal;

-- Decide on the maximum fragmentation to allow for.

SELECT @maxfrag = 30.0;

-- Declare a cursor.

DECLARE tables CURSOR FOR

   SELECT TABLE_SCHEMA + '.' + 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 tables;

-- Loop through all the tables in the database.

FETCH NEXT

   FROM tables

   INTO @tablename;

WHILE @@FETCH_STATUS = 0

BEGIN;

-- Do the showcontig of all indexes of the table

   INSERT INTO #fraglist 

   EXEC ('DBCC SHOWCONTIG (''' + @tablename + ''') 

      WITH FAST, TABLERESULTS, ALL_INDEXES, NO_INFOMSGS');

   FETCH NEXT

      FROM tables

      INTO @tablename;

END;

-- Close and deallocate the cursor.

CLOSE tables;

DEALLOCATE tables;

-- Declare the cursor for the list of indexes to be defragged.

DECLARE indexes CURSOR FOR

   SELECT ObjectName, ObjectId, IndexId, LogicalFrag

   FROM #fraglist

   WHERE LogicalFrag >= @maxfrag

      AND INDEXPROPERTY (ObjectId, IndexName, 'IndexDepth') > 0;

-- Open the cursor.

OPEN indexes;

-- Loop through the indexes.

FETCH NEXT

   FROM indexes

   INTO @tablename, @objectid, @indexid, @frag;

WHILE @@FETCH_STATUS = 0

BEGIN;

   PRINT 'Executing DBCC INDEXDEFRAG (0, ' + RTRIM(@tablename) + ',

      ' + RTRIM(@indexid) + ') - fragmentation currently '

       + RTRIM(CONVERT(varchar(15),@frag)) + '%';

   SELECT @execstr = 'DBCC INDEXDEFRAG (0, ' + RTRIM(@objectid) + ',

       ' + RTRIM(@indexid) + ')';

   EXEC (@execstr);

   FETCH NEXT

      FROM indexes

      INTO @tablename, @objectid, @indexid, @frag;

END;

-- Close and deallocate the cursor.

CLOSE indexes;

DEALLOCATE indexes;

select * from #fraglist

-- Delete the temporary table.

DROP TABLE #fraglist;

GO
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: