56.4. 实现

56.4.1. 缓存的GiST创建

通过插入所有元组来创建一个很大GiST索引通常速度会很慢。 因为如果索引元组被分散到索引的各个地方,并且索引因为太大而不能完全放入缓存,那么插入将需要触发很多随机IO。 从9.2版开始,PostgreSQL支持更加高效的基于缓存的GiST索引创建方法,这种方法可以极大地减少非排序数据集所需的随机IO。 但对于很好地排序过的数据集,这种方法效果甚微,甚至完全没有。 因为这种情况下一次只有少量的页接收新元组,即使整个索引不能放入缓存,这些页却可以完全放到缓存里。

但是,缓存的索引创建需要更多地调用penalty函数,这会消耗一些额外的CPU资源。 而且,缓存的索引创建使用的缓存需要占用临时的磁盘空间,最大为索引的最终大小。 缓存也可能影响最终生成的索引的质量,既有正面的也有负面的影响。 影响依赖于不同的因素,比如输入数据的分布和操作符类的实现。

缺省情况下,当索引大小达到effective_cache_size时,GiST索引创建会切换到缓存方式。 在执行CREATE INDEX命令时,也可以通过BUFFERING参数手动打开或关闭缓存方式。 缺省行为在大多数场合都是合适的,但是如果输入的数据是排过序的,关闭缓存可能多少会快一点。