问题现象
batch nlj 打开时查询结果不正确,示例如下(20 为错误结果):
obclient> set _nlj_batching_enabled = 0;
Query OK, 0 rows affected
obclient> SELECT /*+ PARALLEL(2) leading(t23 view2) use_NL(VIEW2) SEMI_TO_INNER(view1)*/count(*) from t24 where exists (SELECT * FROM T24 T24_6144151 WHERE T24_6144151.C8 = T24.C8);
+----------+
| COUNT(*) |
+----------+
| 19978 |
+----------+
obclient> set _nlj_batching_enabled = 1;
Query OK, 0 rows affected
obclient> SELECT /*+ PARALLEL(2) leading(t23 view2) use_NL(VIEW2) SEMI_TO_INNER(view1)*/count(*) from t24 where exists (SELECT * FROM T24 T24_6144151 WHERE T24_6144151.C8 = T24.C8);
+----------+
| COUNT(*) |
+----------+
| 20 |
+----------+
关键诊断信息
触发条件
nlj 右支存在 limit 下压时走 batch。
问题原因
当前 SQL 执行不支持 nlj 右支存在 limit 下压时走 batch,需禁止。如下例:
obclient>explain SELECT /*+ PARALLEL(2) leading(t23 view2) use_NL(VIEW2) SEMI_TO_INNER(view1)*/count(*) from t24 where exists (SELECT * FROM T24 T24_6144151 WHERE T24_6144151.C8 = T24.C8);
***************************** 1.row *****************************
Query Plan: =====================================================
|ID|OPERATOR |NAME|EST. ROWS|COST |
-------------------------------------------
|0 |SCALAR GROUP BY | |1 |936590|
|1 | NESTED-LOOP JOIN| |19779 |935890|
|2 | TABLE SCAN |XY_T |19978 |7747 |
|3 | SUBPLAN SCAN |VIEW2 |1 |46 |
|4 | DISTRIBUTED TABLE SCAN|T24_6144151 |1 |46 |
==============================================================
Outputs & filters:
---------------------------------------------
0 - output([T_FUN_COUNT(*)]),filter(nil),
group(nil),agg_func([T_FUN_COUNT(*)])
1 - output(nil),filter(nil),
conds(nil),nl_params_([XY_T.CB])
2 - output([XY_T.CB]),filter(nil),
access([XY_T.CB]),partitions(p0)
3 - output(nil),filter(nil),
access([nil])
4 - output(T24_6144151.CB),filter(nil),
access([GROUP_ID],[T24_6144151.CB]),partitions(p0),
limit(1),offset(nil)
问题的风险及影响
结果正确性问题。
影响租户
影响 OceanBase 数据库中的 Oracle 租户和 MySQL 租户,对于 SYS 租户无影响。
影响的版本
OceanBase 数据库 V2.2.77 GA(oceanbase-2.2.77-20210508211731)及之后版本、V3.1.2 GA(oceanbase-3.1.2-20210618150922)及之后版本、V3.2.3 GA(oceanbase-3.2.3.0-20220418212020)及之后版本、V3.2.4 GA(oceanbase-3.2.4.0-100000072022102819)及之后版本。
解决方法
升级至问题已修复版本。目前已修复的版本包括 OceanBase 数据库 V2.2.77 BP14(oceanbase-2.2.77-114000072022120410)及之后版本、V3.1.2 BP11(oceanbase-3.1.2-111000052023010412)及之后版本、V3.2.4 BP2(oceanbase-3.2.4.2-102000042023022717)及之后版本。
关闭 batch nlj:
set _nlj_batching_enabled = 0;。
规避方式
关闭 batch nlj: set _nlj_batching_enabled = 0;。