序列缓存

缓存对于所有序列类型都是类似的:命名序列、标识序列和自动递增序列。为了在群集中的节点之间为给定序列分配缓存,Vertica 使用以下过程。

  1. 默认情况下,当会话开始时,群集启动程序节点会为其自身和群集中的其他节点请求缓存。

  2. 启动程序节点会在分发执行计划时将缓存一并分发给其他节点。

  3. 由于启动程序节点会为所有节点请求缓存,因此只有启动程序会在请求缓存时锁定全局编录。

这种方法最适合处理大型 INSERT-SELECT 和 COPY 操作。下图显示了启动程序如何在三节点群集中为命名序列请求和分发缓存,其中将该序列的缓存设置为 250 K:

各节点在不同的时间用尽缓存。当执行相同的查询时,节点会根据需要单独请求其他缓存。

对于同一个会话中的新查询,如果启动程序使用其所有缓存执行上一个查询执行,则该启动程序可能具有空缓存。在这种情况下,启动程序会为所有节点请求缓存。

可以通过将配置参数 ClusterSequenceCacheMode 设置为 0(禁用)来更改节点获得序列缓存的方式。将此参数设置为 0 时,群集中的所有节点都会请求各自的缓存和编录锁。但是,一开始执行大型 INSERT-SELECT 和 COPY 操作时,如果所有节点的缓存为空,每个节点会同时请求缓存。这些多个请求会导致全局编录上同时出现多个锁定,从而对性能产生不利影响。因此,ClusterSequenceCacheMode 应保持设置为其默认值 1(启用)。

以下示例比较了 ClusterSequenceCacheMode 的不同设置如何影响 Vertica 管理序列缓存的方式。该示例假定一个三节点群集,每个节点 250 K 缓存(默认值),序列 ID 值递增量为 1。