GBase 8a
性能调优
文章

关于_gbase_in_subquery_result_threshold参数说明及限制子查询结果集大小不生效的问题

发表于2024-08-09 10:45:2033次浏览1个评论

GBase 8a提供了多个threshold限制参数,针对in/not in子查询可通过_gbase_in_subquery_result_threshold参数限制子查询结果集,避免结果集太大导致的性能、资源问题。

_gbase_rep_receive_buffer_threshold参数用于限制 in 子查询结果集的 distinct 行数。取值范围[0,1 亿],取值为 0 时表示不限制,默认取值为1000万。该参数控制的是gnode计算节点上的子查询结果集大小

遇到的问题:设置_gbase_in_subquery_result_threshold参数后,子查询结果集超过设定值,依然可以执行出结果,但not in确报错 Express out of resources error:result of 'in' subquery is too large。如下:

这是因为GBase 8a针对in子查询具有转为exists相关子查询优化,通过参数_gbase_optimizer_in_subselect控制,默认为开启。

开启_gbase_optimizer_in_subselect将in子查询转exists相关子查询后,将不受_gbase_rep_receive_buffer_threshold限制。关闭转exists相关子查询后,in查询将报错,如:

对比开启、关闭_gbase_optimizer_in_subselect参数的gcluster trace,执行gcluster层的执行计划并没有改变。对比gnode的trace执行计划,开启_gbase_optimizer_in_subselect后,提示选择exists cond条件进行subselect优化,trace中的关键字如下:

----

如果子查询distinct结果集的条数超过_gbase_rep_receive_buffer_threshold后,依然可以执行成功。那么大概率是GBase 8a的所有gnode节点上的子查询结果集大小都未达到阈值。而节点上子查询结果集的大小,可能受执行计划的影响并不是子查询表中在该节点上的结果数据量。

评论

登录后才可以发表评论
用户头像
levvel发表于 9个月前
来报个到