关于_gbase_in_subquery_result_threshold参数说明及限制子查询结果集大小不生效的问题
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节点上的子查询结果集大小都未达到阈值。而节点上子查询结果集的大小,可能受执行计划的影响并不是子查询表中在该节点上的结果数据量。
热门帖子
- 12025-12-01浏览数:182759
- 22023-05-09浏览数:25044
- 42023-09-25浏览数:18519
- 52020-05-11浏览数:17526