页拆分-产生碎片

索引最初生成时

将索引的数据按照B+树的结构放置在连续的物理页上,这样做的目的是通过连续的i/o扫描索引页面获得最佳的i/o性能。

Insert或者update

当更新后的数据内容超过页面的存储空间容量时,引擎分使用页拆分的方法来获取足够的空间存储新增入进来的索引数据。即另外分配一个新的页面(注意这上页面相对于之前的那些页面是不连续的了),同时将原来页面的数据移动一半的数据到新页上来。最终的结果就是打断了索引页面的物理连续性,使得i/o操作从连续变成不连续,从而降低了性能。

碎片的产生

索引碎片的产生很大原因是大量的页拆分的结果。所以碎片到达一定量时,索引就会失去了快速查找的作用。

避免页拆分

相应索引找到合适的填充因子。一般是85%,这样保证每页上留有15%的空闲空间,但数据变更时,索引数据的扩展就会利用预留空间,减少页拆分的产生。

ALTER INDEX PK_T_PRODUCT ON dbo.T_Product REBUILD WITH(FILLFACTOR = 85);-- 创建索引的时候设置一个填充因子

填充因子0或100

这两种情况下的效果是一样的,即预留空间最少。

填充因子的后果

虽然减少了页拆分的产生。但会带来两种后果:

  1. 索引页存储空间增大。填充因子越接近于0,所耗费空间越大。
  2. 索引页的增多,造成查找效率有所降低。

基于上面的两点,所以最好的做法是:

  1. 找到一个合适的填充因子。比如85%,不能太大也不能太小。
  2. 定期重建索引,替代使用填充因子。但重建索引也须要一定的代价

防止页拆分的设置原则

  1. 聚集索引所在键值保证是不断增长的,最好没有修改数据,采取先删除后加入的原则。这样页拆分是最少的。
  2. 大容量的字段分离到另外的表,保证只有删除和增加的操作。
  3. 数据任何可变字段的修改都可能会引起聚集索引的更新操作。
  4. 非聚集索引所在键值被修改或新增情况下才会产生非聚集索引内容的增大。
posted @ 2013-09-21 17:28  超缘  阅读(294)  评论(0编辑  收藏  举报