全局缓存greenplum查询计划?

Cache greenplum query plan globally?

我想使用计划缓存来节省计划成本,因为 OCRA/Legacy 优化器将花费数十百万秒。

我认为 greenplum 在会话级别缓存查询计划,当会话结束或其他会话无法共享分析计划时。更重要的是,我们不能一直保持会话,因为 gp 系统在 TCP 连接断开之前不会释放资源。

大多数主要数据库缓存计划在第一个 运行 之后,并使用该交叉连接。

那么,是否有任何开关可以打开查询计划缓存交叉连接器?我可以在会话中看到,客户端计时统计与 "Total time" 规划器提供的不匹配?

Postgres 也可以缓存计划,这是基于每个会话的,一旦会话结束,缓存的计划就会被丢弃。这对 optimize/analyze 来说可能很棘手,但通常不太重要,除非您正在执行的查询非常复杂 and/or 有很多重复的查询。

文档非常详细地解释了这些内容。我们可以查询 pg_prepared_statements 来查看缓存的内容。请注意,它不能跨会话使用,仅对当前会话可见。

当用户启动与 Greenplum 数据库的会话并发出查询时,系统会在每个段上创建组或 'gangs' 工作进程来完成工作。工作完成后,除了由 gp_cached_segworkers_threshold 参数设置的缓存编号外,段工作进程将被销毁。

较低的设置可节省分段主机上的系统资源,但较高的设置可能会提高想要连续发出许多复杂查询的高级用户的性能。

另见 gp_max_local_distributed_cache。

显然,缓存越多,可用于其他连接和查询的内存就越少。如果您只托管几个高级用户 运行 并发查询,也许没什么大不了的……但您可能需要相应地调整 gp_vmem_protect_limit。

澄清一下: gp_vmem_idle_resource_timeout后段资源被释放。 只有主会话会保留,直到 TCP 连接断开。