• [zhuan]自动整理索引碎片的代码


    --------------------------------------------------------------------------------
    --
     ensure a use databse statement has been executed first.
    --
    ------------------------------------------------------------------------------
     
    USE GB_BEJ--DBName

    SET nocount ON

    DECLARE @objectid INT ,
        
    @indexid INT ,
        
    @partitioncount BIGINT ,
        
    @schemaname SYSNAME ,
        
    @objectname SYSNAME ,
        
    @indexname SYSNAME ,
        
    @partitionnum BIGINT ,
        
    @partitions BIGINT ,
        
    @frag FLOAT ,
        
    @command VARCHAR(1000) ,
        
    @db_id INT
    SET @db_id = DB_ID()
    PRINT '数据库ID:' + CONVERT(VARCHAR(10),@db_id)
    SELECT  objectid = object_id ,
            indexid 
    = index_id ,
            partitionnum 
    = partition_number ,
            frag 
    = avg_fragmentation_in_percent
    INTO    #work_to_do
    FROM    sys.dm_db_index_physical_stats(@db_idNULLNULLNULL'LIMITED')
    WHERE   avg_fragmentation_in_percent > 5.0
            
    AND index_id > 0

    -- declare the cursor for the list of partitions to be processed.
    DECLARE partitions CURSOR
    FOR
        
    SELECT  *
        
    FROM    #work_to_do

    -- Open the cursor.
    OPEN partitions

    -- Loop through the partitions.
    FETCH NEXT FROM partitions INTO @objectid@indexid@partitionnum@frag

    WHILE @@fetch_status = 0 
        
    BEGIN
            
    SELECT  @objectname = o.name ,
                    
    @schemaname = s.name
            
    FROM    sys.objects AS o
                    
    INNER JOIN sys.schemas AS s ON s.schema_id = o.schema_id
            
    WHERE   o.object_id = @objectid

            
    SELECT  @indexname = name
            
    FROM    sys.indexes
            
    WHERE   object_id = @objectid
                    
    AND index_id = @indexid

            
    SELECT  @partitioncount = COUNT(*)
            
    FROM    sys.partitions
            
    WHERE   object_id = @objectid
                    
    AND index_id = @indexid        

       
    -- 30 is an arbitrary decision point at which to switch between reorganizing and rebuilding
            IF @frag < 30.0 
                
    BEGIN
                    
    SELECT  @command = 'alter index [' + @indexname + '] on '
                            
    + @schemaname + '.' + @objectname + ' reorganize'

                    
    IF @partitioncount > 1 
                        
    SELECT  @command = @command + ' partition='
                                
    + CONVERT(CHAR@partitionnum)
                
    END

            
    IF @frag >= 30.0 
                
    BEGIN
                    
    SELECT  @command = 'alter index [' + @indexname + '] on '
                            
    + @schemaname + '.' + @objectname + ' rebuild'

                    
    IF @partitioncount > 1 
                        
    SELECT  @command = @command + ' partition='
                                
    + CONVERT(CHAR@partitionnum)
                
    END
            
            
            
    PRINT 'Executed: ' + @command    
            
            
    EXEC (@command)
            

            
    FETCH NEXT FROM partitions INTO @objectid@indexid@partitionnum,
                
    @frag
        
    END

    -- free resource
    CLOSE partitions
    DEALLOCATE partitions
    DROP TABLE #work_to_do
  • 相关阅读:
    正则表达式体会
    checkbox、全选反选,获取值
    弹出窗体值回调
    页面点击任意js事件,触发360、IE浏览器新页面
    XML增、删、改
    面试题
    行列转换
    DataTable 和Json 字符串互转
    前台js与后台方法互调
    文件与base64二进制转换
  • 原文地址:https://www.cnblogs.com/itelite/p/2091893.html
Copyright © 2020-2023  润新知