数据库.Sqlserver.重建索引

什么情况下需要重建索引

都和碎片有关系,总结就是一高(高于20%)一低(低于75%),高不成低不就
1.碎片总计过高
参考值→碎片.碎片总计 > 20%

2.碎片填充度过低
参考值→碎片.页填充度 < 75%
导致页填充度过低的可能原因:

[
	"1.有删除",
	"2.有分区表",
	"3.聚集索引不是数字",
	"4.数据比较少(百万以内)"
]

[注意.缺少一张图]

重建索引

ALTER INDEX <name of index> ON <table or view name> 
REBUILD WITH (ONLINE = ON,MAXDOP = 4)
{
	"ONLINE":
	{
		"描述":"是否在线执行",
		"ON":"在线执行,减少重建过程中的锁(执行时间延长)",
		"OFF":"离线执行"
	},
	"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

Sqlserver数据库的好多设置我们都忽略了,
我们日常只是更多的在写SQL语句,
我们可以考虑下升级我们的Sqlserver数据库版本,
优化我们的SQL语句,
深挖在这些SQL语句深处的一些低层知识.

扩展:

第一个阶段为新索引简单够造一颗空B+树...
第二阶段包括由扫描表来获得每行的索引列,对行排序并将它们插入新的B+树中...
最后阶段涉及更新目录以示索引创建已经完成,且索引对查询是可用的.

  • ...

各个情况

  • 在线创建索引Vs离线创建索引
  • 创建索引的时候.表已经存在数据Vs表还没有数据

参考文档

原文地址:https://www.cnblogs.com/love-zf/p/13556601.html