重组索引(带统计索引重组时间)

        由于在工作中,系统重组索引耗时太久,排查不出问题的根源,故此手工写了如下代码。

首先,建立如下日志表

        /****** Object:  Table [dbo].[ReorganizeLog]    Script Date: 06/20/2013 16:09:27 ******/

SET ANSI_NULLS  ON
GO

SET QUOTED_IDENTIFIER  ON
GO

SET ANSI_PADDING  ON
GO

CREATE  TABLE  [ dbo ]. [ ReorganizeLog ](
     [ PKID ]  [ int ]  IDENTITY( 1, 1NOT  NULL,
     [ Name ]  [ varchar ]( 200NULL,
     [ TableName ]  [ varchar ]( 200NULL,
     [ BeginTime ]  [ datetime ]  NULL,
     [ EndTime ]  [ datetime ]  NULL,
     [ TimeSpan ]  [ time ]( 7NULL,
  CONSTRAINT  [ PK_ReorganizeLog ]  PRIMARY  KEY  CLUSTERED 
(
     [ PKID ]  ASC
) WITH (PAD_INDEX   =  OFF, STATISTICS_NORECOMPUTE   =  OFF, IGNORE_DUP_KEY  =  OFF, ALLOW_ROW_LOCKS   =  ON, ALLOW_PAGE_LOCKS   =  ONON  [ PRIMARY ]
ON  [ PRIMARY ]

GO

SET ANSI_PADDING  OFF

GO

       接下来,利用游标对所有索引进行遍历,逐个重组,也可以改成逐个重建,用到的自己动手修改

       USE DbName;

GO

DECLARE  @indexName  varchar( 200),  @tableName  varchar( 100);

DECLARE allIndex  CURSOR  FOR
SELECT  a.name ,
        c.name 
FROM    sysindexes a
         JOIN sysindexkeys b  ON a.id  = b.id
                                AND a.indid  = b.indid
         JOIN sysobjects c  ON b.id  = c.id
WHERE   a.indid  NOT  IN (  0255 )  
  and   c.xtype = ' U '  
ORDER  BY 
        c.name ,
        a.name 

OPEN allIndex;

FETCH  NEXT  FROM allIndex  INTO  @indexName@tableName;

WHILE  @@FETCH_STATUS  =  0
BEGIN

    --  Concatenate and display the current values in the variables.
    PRINT  @indexName  +  ' , '  +   @tableName
   
    declare  @beginTime  datetime, @endTime  datetime, @timespan time, @sql  varchar( 1000)
     set  @beginTime = GETDATE()
     set  @sql = ' ALTER INDEX  ' + @indexName + '  ON  ' + @tableName + '  REORGANIZE WITH ( LOB_COMPACTION = ON ) '
     exec( @sql)
     set  @endTime = GETDATE()
     set  @timespan = @endTime - @beginTime
     INSERT  INTO  [ YeeGoTemp ]. [ dbo ]. [ ReorganizeLog ]( [ Name ], [ TableName ], [ BeginTime ], [ EndTime ], [ TimeSpan ])
          VALUES( @indexName, @tableName, @beginTime, @endTime, @timespan)
    
    FETCH  NEXT  FROM allIndex  INTO  @indexName@tableName;
END

CLOSE allIndex;
DEALLOCATE allIndex;
GO

 

    通过以上代码即可以实现。

    在此以作备忘之用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值