全局缓存greenplum查询计划?
Posted
技术标签:
【中文标题】全局缓存greenplum查询计划?【英文标题】:Cache greenplum query plan globally? 【发布时间】:2018-07-24 09:02:29 【问题描述】:我想使用计划缓存来节省计划器成本,因为 OCRA/Legacy 优化器将花费数千万秒。
我认为greenplum在会话级别缓存查询计划,当会话结束或其他会话无法共享分析的计划时。更重要的是,我们不能一直保持会话,因为 gp 系统在 TCP 连接断开之前不会释放资源。
大多数主要的数据库缓存计划在首次运行后使用,并使用该跨连接。
那么,是否有任何开关可以打开查询计划缓存交叉连接器?我可以在会话中看到,客户端计时统计信息与规划器给出的“总时间”不匹配?
【问题讨论】:
【参考方案1】:Postgres 也可以缓存计划,这是基于每个会话的,一旦会话结束,缓存的计划就会被丢弃。这可能很难优化/分析,但通常不太重要,除非您正在执行的查询非常复杂和/或有很多重复查询。
文档很好地解释了这些细节。我们可以查询 pg_prepared_statements 来查看缓存了什么。请注意,它不能跨会话使用,并且仅对当前会话可见。
当用户启动与 Greenplum 数据库的会话并发出查询时,系统会在每个段上创建工作进程组或“帮派”来完成工作。工作完成后,除了由 gp_cached_segworkers_threshold 参数设置的缓存数字外,段工作进程将被销毁。
较低的设置可以节省分段主机上的系统资源,但较高的设置可能会提高想要连续发出许多复杂查询的高级用户的性能。
另见 gp_max_local_distributed_cache。
显然,您缓存的越多,可用于其他连接和查询的内存就越少。如果您只托管几个运行并发查询的高级用户,这可能没什么大不了的……但您可能需要相应地调整您的 gp_vmem_protect_limit。
为了澄清: 在 gp_vmem_idle_resource_timeout 之后释放段资源。 在 TCP 连接断开之前,只有主会话将保留。
【讨论】:
非常有用的信息,我想详细说明我的问题。将缓存分为“高级”/“低级”缓存,类似于逻辑/物理缓存。我认为主节点流程QD->Analyzer->Optimizer->Plan,segment上的QE会执行。问题之前,我认为gp系统的瓶颈应该是CPU/Network/Master节点,master午餐parallel worker使用遗传算法寻求最佳方案。对于分析的计划,它是昂贵的,应该在ETL完成后缓存utill pg_statistics更新或用户triiger。 对于重新分发/广播的数据,我读过一篇文章,有些扩展可能会缓存元组(再也找不到那个页面了~),应该按命中率最终确定。 对于更底层的层次,gpsystem/postgres已经做了很多努力。 对于顶层,我有很多查询语句架构没有改变的小查询,我想盲目地缓存计划,直到计划到期并更新。我对这些查询使用相同的计划感到满意:SELECT XXX FROM tb WHERE alias='xxx' 或 SELECT XXX FROM tb WHERE alias/email='xxx' 没有办法强制缓存计划——您只能调整缓存参数以影响大小、阈值和时间等因素。以上是关于全局缓存greenplum查询计划?的主要内容,如果未能解决你的问题,请参考以下文章
GreenPlum 使用gpload通过gpfdist文件实现数据高速加载