构建GiST索引最简单的方法就是插入全部条目,一个接一个。 对大的索引这个会趋向于变慢,因为如果索引元组是分散的跨越索引,并且索引大到Cache容不下的时候,将会需要大量随机I/O。 PostgreSQL支持两个可供选择的方法以供GiST索引的初始化构建:sorted 和 buffered 方法。
排序(sorted)的方法仅在用于索引的每个opclasses提供sortsupport
函数的时候有效,就像第 65.3 节中所描述的。
如果满足,这个方法通常是最好的,所以它是缺省使用的。
缓冲(buffered)的方法不直接立刻插入元组到索引。 它能明显的减少非排序数据集所需要的随机I/O的数量。 对于良好排序的数据集,这个收益很小甚至不存在,因为那时只有少数页面会接收新元组,并且那些页面也适合缓存,即便整个索引不能放在缓存中。
缓冲方法比简单的方法需要更频繁的调用penalty
,这样会消耗额外的CPU资源。
还有,缓冲需要临时磁盘空间,最大为结果索引的尺寸。
缓冲也可能影响结果索引的质量,不管是正向还是负向。
这种影响取决于多种因素,如输入数据的分布和操作符类的实现。
如果排序为不可能,则默认情况下,当索引尺寸达到effective_cache_size时,一个 GiST 索引构建会切换到缓冲方法。
缓冲可以通过 CREATE INDEX 命令的buffering
参数手工强制或阻止。
默认行为对大部分情况是好的,但是如果输入数据是排序好的,关闭缓冲特性可能会加速构建过程。