PostgreSQL 9.4.4 文档 | |||
---|---|---|---|
上一页 | 上一级 | 章 56. GiST索引 | 下一页 |
通过插入所有元组来创建一个很大GiST索引通常速度会很慢。 因为如果索引元组被分散到索引的各个地方,并且索引因为太大而不能完全放入缓存,那么插入将需要触发很多随机IO。 从9.2版开始,PostgreSQL支持更加高效的基于缓存的GiST索引创建方法,这种方法可以极大地减少非排序数据集所需的随机IO。 但对于很好地排序过的数据集,这种方法效果甚微,甚至完全没有。 因为这种情况下一次只有少量的页接收新元组,即使整个索引不能放入缓存,这些页却可以完全放到缓存里。
但是,缓存的索引创建需要更多地调用penalty
函数,这会消耗一些额外的CPU资源。
而且,缓存的索引创建使用的缓存需要占用临时的磁盘空间,最大为索引的最终大小。
缓存也可能影响最终生成的索引的质量,既有正面的也有负面的影响。
影响依赖于不同的因素,比如输入数据的分布和操作符类的实现。
缺省情况下,当索引大小达到effective_cache_size时,GiST索引创建会切换到缓存方式。 在执行CREATE INDEX命令时,也可以通过BUFFERING参数手动打开或关闭缓存方式。 缺省行为在大多数场合都是合适的,但是如果输入的数据是排过序的,关闭缓存可能多少会快一点。