C6优化数据库IndexDefrag

来源:互联网 发布:mac版变色龙工具下载 编辑:程序博客网 时间:2024/06/01 10:28
USE [C6]GO/****** 对象:  StoredProcedure [dbo].[IndexDefrag]    脚本日期: 12/19/2012 10:47:07 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO/*索引碎片清理*/ALTER PROCEDURE [dbo].[IndexDefrag]AS     DECLARE @sql NVARCHAR(MAX)    SET @sql = N''    DECLARE @temp TABLE ( sqlText VARCHAR(MAX) )    INSERT  INTO @temp            SELECT  'ALTER INDEX [' + ix.name + '] ON [' + s.name + '].['                    + o.name + '] '                    + CASE WHEN ps.avg_fragmentation_in_percent > 15                           THEN 'REBUILD'                           ELSE 'REORGANIZE'                      END                    + CASE WHEN pc.partition_count > 1                           THEN ' PARTITION = '                                + CAST(ps.partition_number AS NVARCHAR(MAX))                           ELSE ''                      END            FROM    sys.indexes AS ix                    INNER JOIN sys.objects o ON o.object_id = ix.object_id                    INNER JOIN sys.schemas s ON o.schema_id = s.schema_id                    INNER JOIN ( SELECT object_id ,                                        index_id ,                                        avg_fragmentation_in_percent ,--索引的逻辑碎片                                        partition_number ,--分区号(代表未分区)                                        page_count--页数                                 FROM   sys.dm_db_index_physical_stats(DB_ID(),                                                              NULL, NULL, NULL,         --获取统计信息的扫描级别(LIMITED、SAMPLED 或DETAILED),null即LIMITED,用DETAILED的话会有重复数据                                                              NULL)                               ) ps ON o.object_id = ps.object_id                                       AND ix.index_id = ps.index_id                    INNER JOIN ( SELECT object_id ,                                        index_id ,                                        COUNT(DISTINCT partition_number) AS partition_count                                 FROM   sys.partitions                                 GROUP BY object_id ,                                        index_id                               ) pc ON o.object_id = pc.object_id                                       AND ix.index_id = pc.index_id            WHERE   1 = 1                    AND ps.avg_fragmentation_in_percent > 10                    AND ix.name IS NOT NULL                    AND ix.index_id >= 1 --只关注聚集(=1)和非聚集(>1)                    AND page_count > 8 --只关注大小个区(页)以上的                    SELECT  @sql = @sql + N' ' + sqlText    FROM    @temp    EXECUTE sp_executesql @sql

原创粉丝点击