注册

达梦支持(oracle的)hash_sj之类的hint吗

PiscesCanon 2024/03/04 870 19 已解决

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:8.1,安全版,DB Version: 0x7000c
【操作系统】:麒麟 V10
【CPU】:16核 ARMv8 CPU
【问题描述】*:
刚从oracle搬迁到云达梦,发现类似如下半连接sql只能走NEST LOOP SEMI JOIN2,在oracle里边0.1s,在达梦要15s多。
类似SQL:
select * from dgd
where exists (select 1
from p, s
where p.id = s.id
and dgd.hsstr || dgd.exstr like s.hs_str || '%');
无论是达梦还是Oracle,HASH算法都不支持连接条件为like。

所以在oracle里边走了filter,但也比达梦的nl要快的多。
怎么让达梦不使用NEST LOOP SEMI JOIN2。

另外补充说明:关联条件均无索引存在,也就是涉及的3个表都是全表扫描。
Oracle里边的表统计信息都是没问题的并没有使用了动态采样技术。

简单创建表进行测试,脚本如下:
create table dgd (hsstr varchar2(20),exstr varchar2(20));
create table p (id number);
create table s (id number,hs_str varchar2(40));
在Oracle里边执行计划:

----------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | OMem | 1Mem | Used-Mem | ----------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | | 0 |00:00:00.01 | 3 | | | | |* 1 | FILTER | | 1 | | 0 |00:00:00.01 | 3 | | | | | 2 | TABLE ACCESS FULL | DGD | 1 | 1 | 0 |00:00:00.01 | 3 | | | | |* 3 | HASH JOIN | | 0 | 1 | 0 |00:00:00.01 | 0 | 1393K| 1393K| | | 4 | TABLE ACCESS FULL| P | 0 | 1 | 0 |00:00:00.01 | 0 | | | | |* 5 | TABLE ACCESS FULL| S | 0 | 1 | 0 |00:00:00.01 | 0 | | | | ----------------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter( IS NOT NULL) 3 - access("P"."ID"="S"."ID") 5 - filter(:B1||:B2 LIKE "S"."HS_STR"||'%')

在达梦里边执行计划:

SQL> alter session set 'MONITOR_SQL_EXEC'=1; DMSQL executed successfully used time: 1.810(ms). Execute id is 11707. SQL> select * from dgd 2 where exists (select 1 3 from p, s 4 where p.id = s.id 5 and dgd.hsstr || dgd.exstr like s.hs_str || '%'); no rows used time: 0.641(ms). Execute id is 11708. SQL> set linesize 5000 SQL> et(11708); LINEID OP TIME(US) PERCENT RANK SEQ N_ENTER MEM_USED(KB) DISK_USED(KB) HASH_USED_CELLS HASH_CONFLICT DHASH3_USED_CELLS DHASH3_CONFLICT HASH_SAME_VALUE ------- ----- ---------- ------- ------- ----- ----------- ------------- -------------- ----------------- --------------- ----------------- --------------- -------------------- 1 PRJT2 2 1.18% 5 2 2 0 0 0 0 NULL NULL 0 2 DLCK 7 4.12% 4 0 2 0 0 0 0 NULL NULL 0 3 NLS2 10 5.88% 3 3 2 0 0 0 0 NULL NULL 0 4 NSET2 59 34.71% 2 1 2 0 0 0 0 NULL NULL 0 5 CSCN2 92 54.12% 1 4 1 0 0 0 0 NULL NULL 0 used time: 35.821(ms). Execute id is 11721. SQL> explain select * from dgd 2 where exists (select 1 3 from p, s 4 where p.id = s.id 5 and dgd.hsstr || dgd.exstr like s.hs_str || '%'); 1 #NSET2: [1, 1, 108] 2 #PRJT2: [1, 1, 108]; exp_num(3), is_atom(FALSE) 3 #NEST LOOP SEMI JOIN2: [1, 1, 108]; join condition(DGD.HSSTR || DGD.EXSTR LIKE S.HS_STR || '%')[with var] 4 #CSCN2: [1, 1, 108]; INDEX33557305(DGD) 5 #SLCT2: [1, 1, 108]; var4 LIKE S.HS_STR || '%' 6 #HASH2 INNER JOIN: [1, 1, 108]; KEY_NUM(1); KEY(P.ID=S.ID) KEY_NULL_EQU(0) 7 #CSCN2: [1, 1, 30]; INDEX33557306(P) 8 #CSCN2: [1, 1, 78]; INDEX33557308(S)
回答 0
暂无回答
扫一扫
联系客服