zoukankan      html  css  js  c++  java
  • sql的索引碎片查看和重建(转载)

    原文地址:https://blog.csdn.net/zhaow823/article/details/80499431

    查看碎片情况使用  dbcc showcontig 函数来进行

    --改成当前库
    use DB_Name
    --创建变量 指定要查看的表
    declare @table_id int
    set @table_id=object_id('TableName')
    --执行
    dbcc showcontig(@table_id)

    返回结果:

    上边实例的表比较大..一张表占用的实际物理空间就有24个G(数据20G+  索引2G+ )..

    以下是名词解释:

    DBCC SHOWCONTIG是显示指定的表的数据和索引的碎片信息。

    解释如下:

    Page Scanned-扫描页数:如果你知道行的近似尺寸和表或索引里的行数,那么你可以估计出索引里的页数。看看扫描页数,如果明显比你估计的页数要高,说明存在内部碎片。 

    Extents Scanned-扫描扩展盘区数:用扫描页数除以8,四舍五入到下一个最高值。该值应该和DBCC SHOWCONTIG返回的扫描扩展盘区数一致。如果DBCC SHOWCONTIG返回的数高,说明存在外部碎片。碎片的严重程度依赖于刚才显示的值比估计值高多少。 

    Extent Switches-扩展盘区开关数:该数应该等于扫描扩展盘区数减1。高了则说明有外部碎片。 

    Avg. Pages per Extent-每个扩展盘区上的平均页数:该数是扫描页数除以扫描扩展盘区数,一般是8。小于8说明有外部碎片。 

    Scan Density [Best Count:Actual Count]-扫描密度[最佳值:实际值]:DBCC SHOWCONTIG返回最有用的一个百分比。这是扩展盘区的最佳值和实际值的比率。该百分比应该尽可能靠近100%。低了则说明有外部碎片。

    Logical Scan Fragmentation-逻辑扫描碎片:无序页的百分比。该百分比应该在0%到10%之间,高了则说明有外部碎片。 

    Extent Scan Fragmentation-扩展盘区扫描碎片:无序扩展盘区在扫描索引叶级页中所占的百分比。该百分比应该是0%,高了则说明有外部碎片。 

    Avg. Bytes Free per Page-每页上的平均可用字节数:所扫描的页上的平均可用字节数。越高说明有内部碎片,不过在你用这个数字决定是否有内部碎片之前,应该考虑fill factor(填充因子)。 

    Avg. Page Density (full)-平均页密度(完整):每页上的平均可用字节数的百分比的相反数。低的百分比说明有内部碎片

     

    通过sql server 代理创建定时任务定期来重建索引

    dbcc dbreindex ([customer],'',90)

    第一个参数是要重建索引的表名,第二个参数指定索引名称,空着就表示所有,第三个参数叫填充因子,是指索引页的数据填充程度,0表示使用先前的值,100表示每个索引页都填满,这时查询效率最高,但插入索引时会移动其它索引,可根据实际情况来设置。

    DECLARE @TABLENAME NVARCHAR(MAX)
    IF(CURSOR_STATUS('global','TABLE_CURSOR')<>'-3')
        BEGIN
            CLOSE TABLE_CURSOR
            DEALLOCATE TABLE_CURSOR
        END
    DECLARE TABLE_CURSOR CURSOR FOR SELECT NAME FROM SYS.objects WHERE TYPE = 'U' AND name LIKE 'T_HIS%' ORDER BY modify_date DESC
    OPEN TABLE_CURSOR
    FETCH NEXT FROM TABLE_CURSOR INTO @TABLENAME
    WHILE (@@FETCH_STATUS = 0) 
        BEGIN 
            dbcc dbreindex (@TABLENAME,'',80)
            FETCH NEXT FROM TABLE_CURSOR INTO @TABLENAME
        END
    CLOSE TABLE_CURSOR
    DEALLOCATE TABLE_CURSOR

    原文地址:https://blog.csdn.net/a497785609/article/details/99625559

    --1.查看碎片
    SELECT  DB_NAME() AS DatbaseName ,
            SCHEMA_NAME(o.Schema_ID) AS SchemaName ,
            OBJECT_NAME(s.[object_id]) AS TableName ,
            i.name AS IndexName ,
            ROUND(s.avg_fragmentation_in_percent, 2) AS [Fragmentation %] ,
            CASE WHEN avg_fragmentation_in_percent > 30 THEN '严重碎片,索引需要重建'
                 WHEN avg_fragmentation_in_percent >= 5
                      AND avg_fragmentation_in_percent < 30 THEN '轻度碎片,索引需要重新组织'
                 ELSE '正常状态'
            END 提示
    FROM    sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL) s
            INNER JOIN sys.indexes i ON s.[object_id] = i.[object_id] AND s.index_id = i.index_id
            INNER JOIN sys.objects o ON i.object_id = O.object_id
    ORDER BY [Fragmentation %] DESC  
     
    --2.整理碎片(建议在空闲时间运行,尤其不要在生产环境运行)
    SET NOCOUNT ON
    DECLARE @Objectid INT ,
        @Indexid INT ,
        @schemaname VARCHAR(100) ,
        @tablename VARCHAR(300) ,
        @ixname VARCHAR(500) ,
        @avg_fip FLOAT ,
        @command VARCHAR(4000)
    DECLARE IX_Cursor CURSOR
    FOR
        SELECT  A.object_id ,
                A.index_id ,
                QUOTENAME(SS.NAME) AS schemaname ,
                QUOTENAME(OBJECT_NAME(B.object_id, B.database_id)) AS tablename ,
                QUOTENAME(A.name) AS ixname ,
                B.avg_fragmentation_in_percent AS avg_fip
        FROM    sys.indexes A
                INNER JOIN sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL,
                                                          NULL, 'LIMITED') AS B ON A.object_id = B.object_id
                                                                  AND A.index_id = B.index_id
                INNER JOIN SYS.OBJECTS OS ON A.object_id = OS.object_id
                INNER JOIN sys.schemas SS ON OS.schema_id = SS.schema_id
        WHERE   B.avg_fragmentation_in_percent > 10
                AND B.page_count > 20
                AND A.index_id > 0
                AND A.IS_DISABLED <> 1
                --AND OS.name='book'
    ORDER BY    avg_fip DESC ,
                tablename ,
                ixname
    OPEN IX_Cursor
    FETCH NEXT FROM IX_Cursor INTO @Objectid, @Indexid, @schemaname, @tablename,
        @ixname, @avg_fip
    WHILE @@FETCH_STATUS = 0 
        BEGIN 
            --碎片率>5%或<=30%,索引重组
            IF @avg_fip < 30.0 
                SET @command = N'ALTER INDEX ' + @ixname + N' ON ' + @schemaname
                    + N'.' + @tablename + N' REORGANIZE ';
                    
            --碎片率>=30%,索引重建
            IF @avg_fip >= 30.0
                AND @Indexid = 1 
                BEGIN
                    IF EXISTS ( SELECT  *
                                FROM    SYS.columns
                                WHERE   OBJECT_ID = @Objectid
                                        AND max_length IN ( -1, 16 ) ) 
                        SET @command = N'ALTER INDEX ' + @ixname + N' ON '
                            + @schemaname + N'.' + @tablename + N' REBUILD ';
                    ELSE 
                        SET @command = N'ALTER INDEX ' + @ixname + N' ON '
                            + @schemaname + N'.' + @tablename + N' REBUILD '
                            + N' WITH (ONLINE = ON)';
                END
            IF @avg_fip >= 30.0
                AND @Indexid > 1 
                BEGIN 
                    IF EXISTS ( SELECT  *
                                FROM    SYS.index_columns IC
                                        INNER JOIN SYS.columns CS ON CS.OBJECT_ID = IC.OBJECT_ID
                                                                  AND CS.column_id = IC.column_id
                                WHERE   IC.OBJECT_ID = @Objectid
                                        AND IC.index_id = @Indexid
                                        AND CS.max_length IN ( -1, 16 ) ) 
                        SET @command = N'ALTER INDEX ' + @ixname + N' ON '
                            + @schemaname + N'.' + @tablename + N' REBUILD ';
                    ELSE 
                        SET @command = N'ALTER INDEX ' + @ixname + N' ON '
                            + @schemaname + N'.' + @tablename + N' REBUILD '
                            + N' WITH (ONLINE = ON)';
                END
            --打印命令,单独执行
            PRINT @command
            
            --直接执行命令
            --EXEC(@command)
     
            FETCH NEXT FROM IX_Cursor INTO @Objectid, @Indexid, @schemaname,@tablename, @ixname, @avg_fip
        END 
    CLOSE IX_Cursor
    DEALLOCATE IX_Cursor 

  • 相关阅读:
    统计nginx日志里访问次数最多的前十个IP
    while 格式化输出 运算符 字符编码
    Python 软件安装
    Python 基础
    Typora 基础的使用方法
    Django ORM (四) annotate,F,Q 查询
    Django 惰性机制
    Django ORM (三) 查询,删除,更新操作
    Django ORM (二) 增加操作
    Django ORM (一) 创建数据库和模型常用的字段类型参数及Field 重要参数介绍
  • 原文地址:https://www.cnblogs.com/shuaimeng/p/13468332.html
Copyright © 2011-2022 走看看