Henry

曾经沧海难为水,除却巫山不是云,取次花丛懒回顾,半缘修道半缘君。

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

rebuild index

USE DBName
GO

--DROP PROC spRebuildIndex

CREATE PROC spRebuildIndex
    @tableName VARCHAR(100) = NULL ,
    @indexName VARCHAR(200) = NULL
AS 
    BEGIN 

--DECLARE @tableName VARCHAR(100),@indexName VARCHAR(200)
        SELECT  @tableName = NULL ,
                @indexName = NULL

        DECLARE @objName VARCHAR(200) ,
            @ixName VARCHAR(200) ,
            @fragPercent FLOAT ,
            @sql VARCHAR(MAX)
        SET @sql = ''

        DECLARE @indexId INT ,
            @objectId INT
        SELECT  @objectId = object_id ,
                @indexId = index_id
        FROM    sys.indexes
        WHERE   name = @indexName
                AND object_id = OBJECT_ID(@tableName)



        DECLARE cur CURSOR FORWARD_ONLY
        FOR
            SELECT  OBJECT_NAME(a.object_id) ,
                    b.name ,
                    avg_fragmentation_in_percent
            FROM    sys.dm_db_index_physical_stats(DB_ID(), @objectId,
                                                   @indexId, NULL, NULL) a
                    INNER JOIN sys.indexes b ON a.object_id = b.object_id
                                                AND a.index_id = b.index_id
            WHERE   a.index_id != 0
                    AND a.avg_fragmentation_in_percent > 5


        OPEN cur
        FETCH NEXT FROM cur INTO @objName, @ixName, @fragPercent

        WHILE @@fetch_status = 0 
            BEGIN 
  
                IF @fragPercent > 5
                    AND @fragPercent <= 30 
                    BEGIN 
                        SET @sql = 'alter index ' + @ixName + ' on '
                            + @objName + ' REORGANIZE'
                        EXEC(@sql)
                        PRINT ( @objName + ':' + @ixName+' REORGANIZE' )
                    END
                IF @fragPercent > 30 
                    BEGIN 
                        SET @sql = 'alter index ' + @ixName + ' on '
                            + @objName + ' REBUILD'
                        EXEC(@sql)
                         PRINT ( @objName + ':' + @ixName+' REBUILD' )
                    END
  --PRINT(@sql)
              

                FETCH NEXT FROM cur INTO @objName, @ixName, @fragPercent

            END

        CLOSE cur
        DEALLOCATE cur

    END

 

posted on 2012-06-26 16:45  Henry.Lau  阅读(44)  评论(0)    收藏  举报