• MSSQL 重建索引(在线重建、控制最大处理器数 、MAXDOP )


    一、什么情况下需要重建索引

    1、碎片过多(参考值:>20%)

    索引碎片如何产生,请移步至《 T-SQL查询高级—SQL Server索引中的碎片和填充因子》

    2、填充度过低(参考值:<75%)

    导致填充度过低的可能原因:①.有删除 ②.有分区表 ③.聚集索引不是数字 ④.数据百万以内,比较少

    二、重建索引

    ALTER INDEX <name of index> ON <table or view name> REBUILD WITH (ONLINE = ON,MAXDOP = 4)

    ONLINE:在线执行,减少重建过程中的锁 (执行时间延长)

    MAXDOP :手动配置用于运行索引语句的最大处理器数

    说明
    0

    指定服务器根据当前系统工作负荷确定所使用的 CPU 数目。这是默认值,还是推荐设置。

    1

    取消生成并行计划。操作将以串行方式执行。

    2-64

    将处理器的数量限制为指定的值。根据当前工作负荷,可能使用较少的处理器。如果指定的值大于可用的 CPU 数量,将使用实际可用的 CPU 数量。


     -- 查找碎片率大于40
    
    SELECT object_name(object_id) ,index_type_desc,alloc_unit_type_desc,avg_fragmentation_in_percent,
      fragment_count,avg_fragment_size_in_pages,page_count,record_count,
      avg_page_space_used_in_percent
    FROM sys.dm_db_index_physical_stats(DB_ID('DBNAME'), 
    OBJECT_ID(''),NULL,NULL,'Sampled')  
    WHERE avg_fragmentation_in_percent>40


    三、扩展笔记:

    对于碎片的解决办法 (引用自:宋沄剑 SQL Server索引中的碎片和填充因子

        基本上所有解决办法都是基于对索引的重建和整理,只是方式不同

        1.删除索引并重建

           这种方式并不好.在删除索引期间,索引不可用.会导致阻塞发生。而对于删除聚集索引,则会导致对应的非聚集索引重建两次(删除时重建,建立时再重建).虽然这种方法并不好,但是对于索引的整理最为有效

        2.使用DROP_EXISTING语句重建索引

           为了避免重建两次索引,使用DROP_EXISTING语句重建索引,因为这个语句是原子性的,不会导致非聚集索引重建两次,但同样的,这种方式也会造成阻塞

        3.如前面文章所示,使用ALTER INDEX REBUILD语句重建索引

           使用这个语句同样也是重建索引,但是通过动态重建索引而不需要卸载并重建索引.是优于前两种方法的,但依旧会造成阻塞。可以通过ONLINE关键字减少锁,但会造成重建时间加长.

        4.使用ALTER INDEX REORGANIZE

           这种方式不会重建索引,也不会生成新的页,仅仅是整理,当遇到加锁的页时跳过,所以不会造成阻塞。但同时,整理效果会差于前三种.

  • 相关阅读:
    springboot访问静态资源遇到的坑
    mysql存储过程
    sharding-jdbc数据分片配置
    sharding-jdbc springboot配置
    数据库分库分表配置sharding-jdbc
    mysql数据库分库分表shardingjdbc
    angluarJs与后台交互小案例
    angluarJs与后台交互get
    DE1-soc软件实验”hello_word"
    编译到底做什么
  • 原文地址:https://www.cnblogs.com/hydor/p/5254292.html
Copyright © 2020-2023  润新知