用汉语字典作比喻,现在要添加一个字,这个字的拼音叫做“kan”,我们肯定不能加在字典的最后一页,得加在中间,于是字典“kan”以后的字都得往后移,这个工作量的巨大程度可想而知。
如果我们的数据库表没有索引,就不存在填充因子,因为填充因子是针对于索引页的。假如一页可以存储 10 条索引,我们不存储满,只存储 8 条,那么遇到前面的情况,就可以不移动后面的索引,这里不是有 2 条索引的空位么,直接把索引放在这里或者在这一页作些少量的移动就可以了。这就是填充因子,表明一页的填满程度。
那么我们要在这里插入 3 条,是不是要涉及页的移动了,是的,但是这种情况很少发生。在一个表上点右键->设计表->右键->索引/键,我们可以看到,填充因子一项,其中的值默认是 0%,这并不表示不向页中存储任何数据,而是指由 SQL Server 来决定页的填满程度,SQL Server 建议我们使用 0%。如果一个表只读,那么我们可以考虑将填充因子设置为 100%,即不留空。
创建索引时,可以指定一个填充因子,以便在索引的每个叶级页上留出额外的间隙和保留一定百分比的空间,供将来表的数据存储容量进行扩充和减少页拆分的可能性。
对于聚集索引,上面提到的“叶级”,也就是“数据页”,数据页一般比较大,如果不留足一定的空间,每增加一条数据都可能影响其它数据页的移动,性能是很不乐观的。
填充因子的值是 0-100%,0% 表示由系统决定,1% 表示留出的空间最多,100% 表示不留空间。只推荐将只读数据库的填充因子设置为 100%,因为只读数据库的索引不变,不再需要额外的空间来减少页拆分的可能性。平时设置为 0% 即可,这是 SQL Server 推荐的。
可以看出填充因子的目的并不是让页上始终留出那么多的可用空间,该可用空间会随着数据的变动而变动,如果我们重建索引,则会重新分配页,使得每页上的可用空间和刚建立索引时的一样