适用版本
OceanBase 数据库所有版本。
问题现象
在 SQL 中指定 /*+use_hash(a) Leading(c) */ 来让 c 与 a 执行 hash join,并把 c 作为 leading table。
obclient> SELECT /*+use_hash(a) Leading(c) */ c.c1,c.c2,sum(a.c3) c3,sum(a.c4) c4
FROM tbc c INNER joint tba a
ON c.c0=a.c0 AND c.c1=a.c1
WHERE c.c0='1' and c.c7='abc'
group by c.c1,c.c2;
===========================================
|ID|OPERATOR |NAME |EST. ROWS|COST|
-------------------------------------------
|0 |NESTED-LOOP JOIN | |10 |998 |
|1 | TABLE SCAN |C |10 |38 |
|2 | SUBPLAN SCAN |VIEW1|1 |92 |
|3 | MERGE GROUP BY | |1 |92 |
|4 | TABLE SCAN |A |2 |92 |
===========================================
Used Hint:
-------------------------------------
/*+
LEADING(@"SEL$2" ("SYS.C"@"SEL$2" ))
*/
Explain 结果显示 Hint 未生效。
问题原因
因为需要对 A 表进行 GROUP BY 操作,实际与 C 表 Join 的是 GROUP BY 的结果 VIEW1,需要在 USE_HASH 中指定 VIEW1。
解决方法
在 Hint 中使用 view1 代替 a 表。
obclient> SELECT /*+use_hash(view1) Leading(c) */ c.c1,c.c2,sum(a.c3) c3,sum(a.c4) c4
FROM tbc c INNER joint tba a
ON c.c0=a.c0 AND c.c1=a.c1
WHERE c.c0='1' and c.c7='abc'
group by c.c1,c.c2;
=========================================
|ID|OPERATOR |NAME |EST. ROWS|COST|
-----------------------------------------
|0 |HASH JOIN | |15 |1457|
|1 | TABLE SCAN |C |10 |38 |
|2 | SUBPLAN SCAN |VIEW1|100 |1314|
|3 | HASH GROUP BY| |100 |1300|
|4 | TABLE SCAN |A |990 |798 |
=========================================
Used Hint:
-------------------------------------
/*+
LEADING(@"SEL$2" ("SYS.C"@"SEL$2" ))
USE_HASH(@"SEL$2" ("VIEW1"@"SEL$2" ))
*/