构建 GiST 索引的最简单方法就是逐个插入所有条目。对于大型索引,这种方法往往很慢,因为如果索引元组分散在索引中,并且索引大到无法放入高速缓存,则需要大量随机 I/O。 PostgreSQL 支持两种替代方法来初始构建 GiST 索引:排序和缓冲模式。
只有当索引使用的每个操作类提供 sortsupport
函数(如 第 68.3 节 中所述)时,才可以使用排序方法。如果提供,此方法通常是最好的,因此默认使用此方法。
缓冲方法的工作原理是不立即将元组直接插入索引。它可以显著减少无序数据集所需的随机 I/O 量。对于有序数据集,好处较小或不存在,因为一次只有一些页面会收到新元组,并且即使整个索引不适合,这些页面也适合高速缓存。
与简单方法相比,缓冲方法需要更频繁地调用 penalty
函数,这会消耗一些额外的 CPU 资源。此外,缓冲区需要临时磁盘空间,大小取决于生成的索引。缓冲还可以以正面和负面的方式影响生成索引的质量。这种影响取决于各种因素,例如输入数据的分布和运算符类实现。
如果无法排序,则默认情况下,当索引大小达到 effective_cache_size 时,GiST 索引构建将切换到缓冲方法。可以通过 CREATE INDEX 命令的 buffering
参数手动强制或阻止缓冲。默认行为适用于大多数情况,但如果输入数据已排序,则关闭缓冲可能会加快构建速度。