索引最初生成时 |
将索引的数据按照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 |
这两种情况下的效果是一样的,即预留空间最少。 |
填充因子的后果 |
虽然减少了页拆分的产生。但会带来两种后果:
基于上面的两点,所以最好的做法是:
|
防止页拆分的设置原则 |
|