什么情况下需要重建索引
都和碎片有关系,总结就是一高(高于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语句深处的一些低层知识.
扩展:
- 碎片怎么产生&碎片如何影响到了索引的价值,导致了要重建索引(不破不立)等
→博客园.T-SQL查询高级—SQL Server索引中的碎片和填充因子 - 重建索引分需要几步
第一个阶段为新索引简单够造一颗空B+树...
第二阶段包括由扫描表来获得每行的索引列,对行排序并将它们插入新的B+树中...
最后阶段涉及更新目录以示索引创建已经完成,且索引对查询是可用的.
- ...
各个情况
- 在线创建索引Vs离线创建索引
- 创建索引的时候.表已经存在数据Vs表还没有数据
参考文档
- 博客园.MSSQL 重建索引
- [数据库系统概念.第30章]