一、说明
`gp_max_plan_size` 是 `Greenplum` 数据库中的一个配置参数,用于指定查询执行计划的最大未压缩大小(以千字节为单位)。这个参数乘以计划中移动操作符(切片)的数量,得出的结果就是计划的总大小。如果查询计划的大小超过了 `gp_max_plan_size` 指定的值,则查询将被取消,并返回错误。
本次使用的环境是梧桐数据库V5.x版本,此版本有两个执行器,为新老执行器,两个执行器行为一致。梧桐数据库V6.x版本也有两个执行器,但是目前新执行器在V6.x中不够完善,固没有完全放开,后续会陆续支持。在本参数上,V6.x版本默认是关闭的,所以默认情况下,V6.x不会出现此问题。
当查询中包含大量的 `UNION ALL` 操作时,查询计划可能会变得非常庞大,这种情况下,若设置的gp_max_plan_size 参数值较低,则会导致查询失败
> 如果将 `gp_max_plan_size` 设置为 0,则表示不对查询计划的大小进行监视 。
> 报错解释: `Query plan slice number limit exceeded` 表示查询计划中的切片数量超过了设定的限制; `current: 54` 表示当前查询计划中的切片数量为54;`max allowed: 36:` 表示系统允许的最大切片数量为36;`Slice number controlled by gp_max_plan_slice: `表示切片数量是由配置参数 `gp_max_plan_slice` 控制的,用户可以通过调整该参数的值来允许更多的切片避免该错误发生。
二、处理结果
当查询计划因大小超过 `gp_max_plan_size` 而取消时,用户会收到一个明确的错误消息,指出查询由于超出了计划大小限制而被终止。这可以帮助用户了解查询计划的规模,并根据需要调整查询或参数设置。例如,如果用户发现查询计划频繁因超大数据量而失败,可能需要考虑优化查询逻辑或增加 `gp_max_plan_size` 的值,以便能够处理更大的数据集。在进行查询的 `sql` 前进行 `set gp_max_plan_size = xxx;` 即可。
> 以下是遇到此类问题的相应应对思路:
> - 一是调整 `gp_max_plan_slice` 参数;
> - 二是做查询优化;优化 `sql` 以确保不产生超过限制的切片数。
> - 三是进行监控和评估。如监控系统的性能,以确保在增加切片数量后不会对资源产生负担,确保其他相关的配置参数,如内存和并发设置,也与 `gp_max_plan_slice` 的调整相匹配。
三、补充说明
在实际使用中,合理配置 `gp_max_plan_size` 对于防止资源过度消耗和保证查询性能是非常重要的。管理员可以根据系统的内存容量和查询的复杂性来调整此参数,以达到最优的查询性能和资源利用平衡。此外,`gp_max_plan_size` 仅适用于 master 节点,并且**只有超级用户才能修改此设置** 。在设置时,用户还可以指定大小单位,如 `kB`(千字节,默认),`MB`(兆字节)或 `GB`(吉字节)。例如,`1GB` 等同于 `1024MB` 或 `1048576kB` 。
通过合理设置 `gp_max_plan_size`,用户可以有效地控制查询执行计划的规模,避免因计划过大导致的资源浪费和查询失败,从而提高数据库的整体性能和稳定性。