SQL基础【二十、索引】(超细致版本,前理论,后实践,应对sql面试绰绰有余)(五)

7、索引碎片


如果你的表已经创建好了索引,但性能却仍然不好,那很可能是产生了索引碎片,你需要进行索引碎片整理。


 什么是索引碎片?


 由于表上有过度地插入、修改和删除操作,索引页被分成多块就形成了索引碎片,如果索引碎片严重,那扫描索引的时间就会变长,甚至导致索引不可用,因此数据检索操作就慢下来了。


 如何知道是否发生了索引碎片?


在SQLServer数据库,通过DBCC ShowContig或DBCC ShowContig(表名)检查索引碎片情况,指导我们对其进行定时重建整理。  


SQL基础【二十、索引】(超细致版本,前理论,后实践,应对sql面试绰绰有余)(五)


通过对扫描密度(过低),扫描碎片(过高)的结果分析,判定是否需要索引重建,主要看如下两个:


Scan Density [Best Count:Actual Count]-扫描密度[最佳值:实际值]:DBCC


SHOWCONTIG返回最有用的一个百分比。这是扩展盘区的最佳值和实际值的比率。该百分比应该尽可能靠近100%。低了则说明有外部碎片。


Logical Scan Fragmentation-逻辑扫描碎片:无序页的百分比。该百分比应该在0%到10%之间,高了则说明有外部碎片。


解决方式:


一是利用DBCC INDEXDEFRAG整理索引碎片


二是利用DBCC DBREINDEX重建索引。


两者区别调用微软的原话如下:


DBCC INDEXDEFRAG 命令是联机操作,所以索引只有在该命令正在运行时才可用,而且可以在不丢失已完成工作的情况下中断该操作。这种方法的缺点是在重新组织数据方面没有聚集索引的除去/重新创建操作有效。


重新创建聚集索引将对数据进行重新组织,其结果是使数据页填满。填满程度可以使用 FILLFACTOR 选项进行配置。这种方法的缺点是索引在除去/重新创建周期内为脱机状态,并且操作属原子级。如果中断索引创建,则不会重新创建该索引。也就是说,要想获得好的效果,还是得用重建索引,所以决定重建索引。


上一篇:PHP判断文件或者目录是否可写


下一篇:php函数str_replace替换一次字符串