一、什么情况下需要重建索引
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
这种方式不会重建索引,也不会生成新的页,仅仅是整理,当遇到加锁的页时跳过,所以不会造成阻塞。但同时,整理效果会差于前三种.