首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

如何对SQL Server里怎样整理索引碎片

2012-12-26 
怎么对SQL Server里怎样整理索引碎片帮助看的不是很懂,只能一个索引一个索引这样处理的吗?可不可以整个表

怎么对SQL Server里怎样整理索引碎片
帮助看的不是很懂,只能一个索引一个索引这样处理的吗?可不可以整个表这样处理?
[最优解释]

/******************************************************************************************
 * 使用   DBCC   SHOWCONTIG   和   DBCC   INDEXDEFRAG   对数据库中的索引进行碎片整理
 * 下例显示对数据库中碎片数量在声明的阈值之上的所有索引进行碎片整理的简单方法。
 ******************************************************************************************/

a
/*Perform   a   'USE   <database   name> '   to   select   the   database   in   which   to   run   the   script.*/
--   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

--   Decide   on   the   maximum   fragmentation   to   allow
SELECT @maxfrag = 30.0

--   Declare   cursor
DECLARE 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   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   cursor   for   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

--   Delete   the   temporary   table
DROP   TABLE   #fraglist
GO 


[其他解释]
dbcc 
[其他解释]
维护计划里 有索引的管理。
[其他解释]
建议使用维护计划→新建维护计划→重新组织索引/重新生成索引→配置好之后,生成脚本,也可以定义一个作业让它自己操作。

热点排行