62.4. Implementation

62 .4.1. GiST 缓冲构建

通过简单地插入所有 Tuples 来构建大型 GiST 索引的速度往往很慢,因为如果索引 Tuples 分散在整个索引中并且索引足够大而无法容纳在缓存中,则插入需要执行大量的随机 I/O。从 9.2 版开始,PostgreSQL 支持一种更有效的基于缓冲构建 GiST 索引的方法,该方法可以大大减少无序数据集所需的随机 I/O 数量。对于 Sequences 良好的数据集,其好处是较小或根本不存在,因为一次只有很少一部分页面接收新的 Tuples,并且即使整个索引都没有,这些页面也适合缓存。

但是,缓冲索引构建需要更频繁地调用penalty函数,这会消耗一些额外的 CPU 资源。同样,在缓冲构建中使用的缓冲区需要临时磁盘空间,最大为结果索引的大小。缓冲还会在正向和负向两个方面影响所得索引的质量。这种影响取决于各种因素,例如 Importing 数据的分布和操作员类别的实现。

默认情况下,当索引大小达到effective_cache_size时,GiST 索引构建会切换到缓冲方法。可以通过 CREATE INDEX 命令的buffering参数手动将其打开或关闭。默认行为在大多数情况下都很好,但是如果 Order 了 Importing 数据,则关闭缓冲可能会加快构建速度。