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

发布时间 2023-08-22 00:29:37作者: 大西瓜3721

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

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

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