达梦数据库SQL执行计划常用操作符1
1. PRJT2
关系的“投影”(project)运算,用于选择表达式项的计算;广泛用于查询,排序,函数索引创建等。
SQL>explain select c1 + c2 from t1;
explain select c1 + c2 from t1;
#NSET2: [6, 1, 0]
#PRJT2: [6, 1, 0]; exp_num(2), is_atom(FALSE)
#CSCN2: [6, 1, 0]; INDEX33555457(T1)
2. NSET2
结果集(result set)收集,一般是查询计划的顶层节点。
SQL>explain select c1 + c2 from t1;
explain select c1 + c2 from t1;
#NSET2: [6, 1, 0]
#PRJT2: [6, 1, 0]; exp_num(2), is_atom(FALSE)
#CSCN2: [6, 1, 0]; INDEX33555457(T1)
3. SLCT2
关系的“选择”(select)运算,用于查询条件的过滤。
explain select * from t1 where c1 >1;
#NSET2: [6, 1, 0]
#PRJT2: [6, 1, 0]; exp_num(3), is_atom(FALSE)
#SLCT2: [6, 1, 0]; T1.C1 > 1
#CSCN2: [6, 1, 0]; INDEX33555457(T1)
4. NEST LOOP INNER JOIN2
简写为NLI2,嵌套循环内连接;没有索引可用,且无法用HASH,(如不等值比较),则可能使用NLI2
explain select * from t1, t2 where t1.c1 >t2.c2;
#NSET2: [19, 1, 0]
#PRJT2: [19, 1, 0]; exp_num(4), is_atom(FALSE)
#SLCT2: [19, 1, 0]; T1.C1 > T2.C2
#NEST LOOP INNER JOIN2: [19, 1, 0];
#CSCN2: [6, 1, 0]; INDEX33555457(T1)
#CSCN2: [6, 1, 0]; INDEX33555458(T2)
5. MERGE INNER JOIN3
简写为MI3,归并内连接;有索引可用时,有可能使用MI3。
explain select a.c1, b.c1 from tx a, tx b where a.c1 = b.c1;
#NSET2: [29, 100000, 0]
#PRJT2: [29, 100000, 0]; exp_num(2), is_atom(FALSE)
#MERGE INNER JOIN3: [29, 100000, 0];
#CSCN2: [23, 100000, 0]; INDEX33555463(TX)
#CSCN2: [23, 100000, 0]; INDEX33555463(TX)
6. NEST LOOP FULL JOIN2
简写为NLFO2,嵌套循环全外连接。一般不等值连接时使用。
explain select *from t1 full join t2 on t1.c1 <> t2.c1;
#NSET2: [19, 1, 0]
#PRJT2: [19, 1, 0]; exp_num(4), is_atom(FALSE)
#NEST LOOP FULL JOIN2: [19, 1, 0]; join condition(T1.C1 <> T2.C1)
#CSCN2: [6, 1, 0]; INDEX33555457(T1)
#CSCN2: [6, 1, 0]; INDEX33555458(T2)
7. NEST LOOP LEFT JOIN2
简写为NLLO2,嵌套循环左外连接。一般不等值连接时使用。
explain select *from t1 left join t2 on t1.c1 <> t2.c1;
#NSET2: [19, 1, 0]
#PRJT2: [19, 1, 0]; exp_num(4), is_atom(FALSE)
#NEST LOOP LEFT JOIN2: [19, 1, 0]; join condition(T1.C1 <> T2.C1)
#CSCN2: [6, 1, 0]; INDEX33555457(T1)
#CSCN2: [6, 1, 0]; INDEX33555458(T2)
8. HASH LEFT JOIN2
简写为HLO2,HASH左外连接。一般等值连接时使用。
explain select *from t1 left join t2 on t1.c1 = t2.c1;
#NSET2: [13, 1, 0]
#PRJT2: [13, 1, 0]; exp_num(4), is_atom(FALSE)
#HASH LEFT JOIN2: [13, 1, 0]; key_num(1),
#CSCN2: [6, 1, 0]; INDEX33555457(T1)
#CSCN2: [6, 1, 0]; INDEX33555458(T2)
9. HASH RIGHT JOIN2
简写为HRO2,HASH右外连接。下面的例子,做一个tx与t2的左连接。因为t2的行数很小,tx比较大,所以自动转为右连接,在t2上建hash的代价比较小。
explain select * from tx left join t2 on t2.c1 = tx.c1 + 2;
#NSET2: [39, 100000, 0]
#PRJT2: [39, 100000, 0]; exp_num(4), is_atom(FALSE)
#HASH RIGHT JOIN2: [39, 100000, 0]; key_num(1),
#CSCN2: [6, 1, 0]; INDEX33555458(T2)
#CSCN2: [23, 100000, 0]; INDEX33555463(TX)
10. HASH FULL JOIN2
简写为HFO2,HASH全外连接。等值连接时可用;
explain select *from t1 full join t2 on t1.c1 = t2.c1;
#NSET2: [13, 1, 0]
#PRJT2: [13, 1, 0]; exp_num(4), is_atom(FALSE)
#HASH FULL JOIN2: [13, 1, 0]; key_num(1),
#CSCN2: [6, 1, 0]; INDEX33555457(T1)
#CSCN2: [6, 1, 0]; INDEX33555458(T2)
11. TOPN2
取前N个记录;
explain select top 10 * from t1;
#NSET2: [6, 1, 0]
#PRJT2: [6, 1, 0]; exp_num(3), is_atom(FALSE)
#TOPN2: [6, 1, 0]; top_num(10)
#CSCN2: [6, 1, 0]; INDEX33555457(T1)
12. UNION ALL
Union all 运算,
explain select *from t1 union all select *from t2;
#NSET2: [13, 2, 0]
#PRJT2: [13, 2, 0]; exp_num(2), is_atom(FALSE)
#UNION ALL: [13, 2, 0]
#PRJT2: [6, 1, 0]; exp_num(2), is_atom(FALSE)
#CSCN2: [6, 1, 0]; INDEX33555457(T1)
#PRJT2: [6, 1, 0]; exp_num(2), is_atom(FALSE)
#CSCN2: [6, 1, 0]; INDEX33555458(T2)
13. UNION
集合的并运算,
explain select *from t1 union select *from t2;
#NSET2: [13, 2, 0]
#PRJT2: [13, 2, 0]; exp_num(2), is_atom(FALSE)
#UNION: [13, 2, 0]
#PRJT2: [6, 1, 0]; exp_num(2), is_atom(FALSE)
#CSCN2: [6, 1, 0]; INDEX33555457(T1)
#PRJT2: [6, 1, 0]; exp_num(2), is_atom(FALSE)
#CSCN2: [6, 1, 0]; INDEX33555458(T2)
14. EXCEPT / EXCEPT ALL
集合的差运算
explain select * from t1 except select * from t2;
#NSET2: [13, 1, 0]
#PRJT2: [13, 1, 0]; exp_num(2), is_atom(FALSE)
#EXCEPT: [13, 1, 0]
#PRJT2: [6, 1, 0]; exp_num(2), is_atom(FALSE)
#CSCN2: [6, 1, 0]; INDEX33555480(T1)
#PRJT2: [6, 1, 0]; exp_num(2), is_atom(FALSE)
#CSCN2: [6, 1, 0]; INDEX33555476(T2)
15. INTER SECT/ INTERSECT ALL
集合的交运算
explain select * from t1 intersect select * from t2;
#NSET2: [13, 1, 0]
#PRJT2: [13, 1, 0]; exp_num(2), is_atom(FALSE)
#INTERSECT: [13, 1, 0]
#PRJT2: [6, 1, 0]; exp_num(2), is_atom(FALSE)
#CSCN2: [6, 1, 0]; INDEX33555480(T1)
#PRJT2: [6, 1, 0]; exp_num(2), is_atom(FALSE)
#CSCN2: [6, 1, 0]; INDEX33555476(T2)
16. INSERET/VINS2
插入记录,其中VINS2用于列存储表
explain insert into t1 values(1, 1);
#INSERT : [0, 0, 0]; table(T1), type(values)
17. HAGR2
Hash aggregate; HASH 分组,并计算聚集函数
explain select count(*) from tx group by c2;
#NSET2: [23, 1000, 0]
#PRJT2: [23, 1000, 0]; exp_num(1), is_atom(FALSE)
#HAGR2: [23, 1000, 0]; grp_num(1), sfun_num(1)
#CSCN2: [23, 100000, 0]; INDEX33555479(TX)
18. SAGR2
Stream Aggregate;如果输入流是有序的,则使用流分组,并计算聚集函数
explain select count(*) from tx group by c1;
#NSET2: [23, 1000, 0]
#PRJT2: [23, 1000, 0]; exp_num(1), is_atom(FALSE)
#SAGR2: [23, 1000, 0]; grp_num(1), sfun_num(1)
#CSCN2: [23, 100000, 0]; INDEX33555479(TX)
19. FAGR2
Fast aggregate;如果没有where条件,且取count(*), 或者基于索引的MAX/MIN值,则可以快速取得集函数的值
explain select count(*) from t1;
#NSET2: [6, 1, 0]
#PRJT2: [6, 1, 0]; exp_num(1), is_atom(FALSE)
#FAGR2: [6, 1, 0]; sfun_num(1)
20. AAGR2
简单聚集;如果没有分组(group by), 则总的就一个组,直接计算聚集函数
explain select count(*) from tx where c2 = 10;
#NSET2: [22, 1, 0]
#PRJT2: [22, 1, 0]; exp_num(1), is_atom(FALSE)
#AAGR2: [22, 1, 0]; grp_num(0), sfun_num(1)
#SLCT2: [22, 2500, 0]; exp_cast(TX.C2) = var1
#CSCN2: [22, 100000, 0]; INDEX33555479(TX)
21. HASH LEFT SEMI JOIN2
HASH 左半连接; 扫描左表建立hash表,扫描右表探测HASH表,最后输出被探测到的左表的行
explain select * from t1 where c1 in (select c2 from tx);
#NSET2: [35, 1, 0]
#PRJT2: [35, 1, 0]; exp_num(3), is_atom(FALSE)
#HASH LEFT SEMI JOIN2: [35, 1, 0];
#CSCN2: [6, 1, 0]; INDEX33555480(T1)
#PRJT2: [22, 100000, 0]; exp_num(1), is_atom(FALSE)
#CSCN2: [22, 100000, 0]; INDEX33555479(TX)
22. CSCN2/VSCN2
聚集索引扫描(cluster index scan); VSCN2用于列存储表
explain select *from t1;
#NSET2: [6, 1, 0]
#PRJT2: [6, 1, 0]; exp_num(3), is_atom(FALSE)
#CSCN2: [6, 1, 0]; INDEX33555480(T1)
23. DSCN
Dynamic table scan; 动态视图扫描
explain select * from v$threads;
#NSET2: [6, 1, 0]
#PRJT2: [6, 1, 0]; exp_num(3), is_atom(FALSE)
#DSCN: [6, 1, 0]; SYSINDEXV$THREADS(V$THREADS)
24. DELETE/VDEL2
删除数据, 其中VDEL2用于列存储表
explain delete from t1 where c1 = 1;
#DELETE : [0, 0, 0]; table(T1), type(select)
#TEMP TABLE SPOOL: [6, 1, 0]
#PRJT2: [6, 1, 0]; exp_num(1), is_atom(FALSE)
#SLCT2: [6, 1, 0]; T1.C1 = 1
#CSCN2: [6, 1, 0]; INDEX33555480(T1)
25. SORT3
排序
explain select * from t1 order by c1;
#NSET2: [6, 1, 0]
#PRJT2: [6, 1, 0]; exp_num(3), is_atom(FALSE)
#SORT3: [6, 1, 0]; key_num(1), is_distinct(FALSE)
#CSCN2: [6, 1, 0]; INDEX33555480(T1)
26. TEMP TABLE SPOOL
临时表,临时存放数据;如delete/update时,临时存放ROWID, PK等定位信息
explain delete from t1 where c1 = 1;
#DELETE : [0, 0, 0]; table(T1), type(select)
#TEMP TABLE SPOOL: [6, 1, 0]
#PRJT2: [6, 1, 0]; exp_num(1), is_atom(FALSE)
#SLCT2: [6, 1, 0]; T1.C1 = 1
#CSCN2: [6, 1, 0]; INDEX33555480(T1)
27. PIPE2
管道;先做一遍右儿子,然后执行左儿子,并把左儿子的数据向上送,直到左儿子不再有数据。
explain select (select 2) from t1;
#NSET2: [6, 1, 0]
#PRJT2: [6, 1, 0]; exp_num(2), is_atom(FALSE)
#PIPE2: [6, 1, 0]
#CSCN2: [6, 1, 0]; INDEX33555480(T1)
#SPOOL2: [0, 1, 0]; key_num(1), spool_num(0)
#PRJT2: [0, 1, 0]; exp_num(1), is_atom(TRUE)
#CSCN2: [0, 1, 0]; SYSINDEXSYSDUAL(SYSDUAL)
28. SPOOL2
也是临时表;和TEMP TABLE SPOOL(NTTS)不同的是,它的数据集不向父亲节点传送,而是被编号,用编号和KEY来定位访问;而TEMP TABLE SPOOL的数据,主动传递给父亲节点;
explain select (select 2) from t1;
#NSET2: [6, 1, 0]
#PRJT2: [6, 1, 0]; exp_num(2), is_atom(FALSE)
#PIPE2: [6, 1, 0]
#CSCN2: [6, 1, 0]; INDEX33555480(T1)
#SPOOL2: [0, 1, 0]; key_num(1), spool_num(0)
#PRJT2: [0, 1, 0]; exp_num(1), is_atom(TRUE)
#CSCN2: [0, 1, 0]; SYSINDEXSYSDUAL(SYSDUAL)
29. CSEK2
聚集索引数据定位;(cluster index seek)
explain select *from tx where c1 = 20;
#NSET2: [6, 1, 0]
#PRJT2: [6, 1, 0]; exp_num(3), is_atom(FALSE)
#CSEK2: [6, 1, 0]; scan_type(UNIQUE),INDEX33555479(TX), scan_range[20,20]
30. SSEK2
2级索引数据定位;(second index seek)
create index ind2 on tx(c2);
explain select c2 from tx where c2 = 'aaa';
#NSET2: [6, 2500, 0]
#PRJT2: [6, 2500, 0]; exp_num(1), is_atom(FALSE)
#SSEK2: [6, 2500, 0]; scan_type(ASC), IND2(TX), scan_range[aaa,aaa]
31. BLKUP2
(Batch lookup), 使用2级别索引的定位信息, 在聚集索引中查找数据
explain select * from tx where c2 = 'aaa';
#NSET2: [20, 2500, 0]
#PRJT2: [20, 2500, 0]; exp_num(4), is_atom(FALSE)
#BLKUP2: [20, 2500, 0]; IND2(TX)
#SSEK2: [20, 2500, 0]; scan_type(ASC), IND2(TX), scan_range[aaa,aaa]
32. NEST LOOP SEMI JOIN2
嵌套循环半连接。通常用于无法使用HASH, 索引的不等值的In/Exists;效率比较差。
explain select * from t1 where exists (select * from t2 where t1.c1 <> t2.c1);
#NSET2: [19, 1, 0]
#PRJT2: [19, 1, 0]; exp_num(3), is_atom(FALSE)
#NEST LOOP SEMI JOIN2: [19, 1, 0]; join condition(T1.C1 <> T2.C1)
#CSCN2: [6, 1, 0]; INDEX33555480(T1)
#CSCN2: [6, 1, 0]; INDEX33555476(T2)
33. NEST LOOP INDEX JOIN2
嵌套循环索引连接(IJI2)。 右表上有索引, 对于左表的每一行,利用索引在右表中定位。这是DM6中最常用的优化方式;DM7由于HASH连接比较成熟,因此其重要性略有下降。
explain select *from t1, tx where t1.c1 = tx.c1;
#NSET2: [26, 1, 0]
#PRJT2: [26, 1, 0]; exp_num(5), is_atom(FALSE)
#NEST LOOP INDEX JOIN2: [26, 1, 0]
#CSCN2: [6, 1, 0]; INDEX33555480(T1)
#CSEK2: [19, 1, 0]; scan_type(UNIQUE),INDEX33555479(TX), scan_range[T1.C1,T1.C1]
34. HASH2 INNER JOIN
HASH内连接(HI3);无法利用索引时,系统一般采用HASH连接。
explain select *from t1, t2 where t1.c1 = t2.c1;
#NSET2: [13, 1, 0]
#PRJT2: [13, 1, 0]; exp_num(4), is_atom(FALSE)
#HASH2 INNER JOIN: [13, 1, 0]; KEY_NUM(1);
#CSCN2: [6, 1, 0]; INDEX33555480(T1)
#CSCN2: [6, 1, 0]; INDEX33555476(T2)
35. INDEX JOIN SEMI JOIN2
索引半连接。在半连接的右表中,有索引可利用时使用,如下例tx(c1)上有索引。
explain select *from t1 where exists (select * from tx where t1.c1 = tx.c1);
#NSET2: [8, 1, 0]
#PRJT2: [8, 1, 0]; exp_num(3), is_atom(FALSE)
#INDEX JOIN SEMI JOIN2: [8, 1, 0];
#CSCN2: [6, 1, 0]; INDEX33555480(T1)
#CSEK2: [19, 1, 0]; scan_type(UNIQUE), INDEX33555479(TX), scan_range[T1.C1,T1.C1]
36. HASH RIGHT SEMI JOIN2
HASH右半连接(HRS2)。半连接一般情况下,总是在左表建立HASH, 如果右表数据更少,则转化为右半连接。
explain select * from tx where exists (select *from t1 where tx.c3 = t1.c2);
#NSET2: [40, 1, 0]
#PRJT2: [40, 1, 0]; exp_num(4), is_atom(FALSE)
#HASH RIGHT SEMI JOIN2: [40, 1, 0];
#CSCN2: [6, 1, 0]; INDEX33555480(T1)
#CSCN2: [23, 100000, 0]; INDEX33555479(TX)
37. HASH RIGHT SEMI JOIN32
HASH右半连接。这个专门用来处理all/any/some等谓词。但all/any/some不是必须用这个操作符。
explain select *from tx where c3 > all(select c2 from t1);
#NSET2: [30, 100000, 0]
#PRJT2: [30, 100000, 0]; exp_num(4), is_atom(FALSE)
#HASH RIGHT SEMI JOIN32: [30, 100000, 0]; op all;, join condition(TX.C3 > DMTEMPVIEW_00001021.col_name)
#CSCN2: [23, 100000, 0]; INDEX33555479(TX)
#PRJT2: [6, 1, 0]; exp_num(1), is_atom(FALSE)
#CSCN2: [6, 1, 0]; INDEX33555480(T1)
38. MERGE SEMI JOIN3
归并半连接。如果连接的关键字正好是索引列,则可以使用。
explain select * from tx a where exists (select *from tx b where a.c1 = b.c1 and b.c3 = 10);
#NSET2: [27, 2500, 0]
#PRJT2: [27, 2500, 0]; exp_num(4), is_atom(FALSE)
#MERGE SEMI JOIN3: [27, 2500, 0];
#CSCN2: [23, 100000, 0]; INDEX33555479(TX)
#SLCT2: [23, 2500, 0]; TX.C3 = 10
#CSCN2: [23, 100000, 0]; INDEX33555479(TX)
39. CONST VALUE LIST
系统自动创建的一个常量列表,用于与实体表做连接。
explain select *from t1 where c1 in (1, 2, 3);
#NSET2: [6, 1, 0]
#PRJT2: [6, 1, 0]; exp_num(3), is_atom(FALSE)
#HASH2 INNER JOIN: [6, 1, 0]; KEY_NUM(1);
#CSCN2: [6, 1, 0]; INDEX33555480(T1)
#CONST VALUE LIST: [0, 3, 0]; row_num(3), col_num(1)
40. HEAP TABLE/HEAP TABLE SCAN
有时,系统会把重复利用的中间保存在一个临时表中,这个表称为HEAP TABLE;与之配套的是,一个专门的扫描操作符号。(HTAB/HSCN)
explain with v1 as
(select count(*) from tx)
select *
from v1 a, v1 b;
#NSET2: [89, 1, 0]
#PIPE2: [89, 1, 0]
#PRJT2: [66, 1, 0]; exp_num(2), is_atom(FALSE)
#NEST LOOP INNER JOIN2: [66, 1, 0];
#HEAP TABLE SCAN: [22, 1, 0]; table_no(0),
#HEAP TABLE SCAN: [22, 1, 0]; table_no(0),
#HEAP TABLE: [22, 1, 0]; table_no(0),
#PRJT2: [22, 1, 0]; exp_num(1), is_atom(FALSE)
#FAGR2: [22, 1, 0]; sfun_num(1)
41. FBTR
Fill Btr, 填充B树。建索引的时候使用。一般不能用explain看,到, 但是建索引的时候,可以在V$SQL_NODE_HISTORY中查到 。
42. UFLT
(Filter for Update from),这是个用于实现UPDATE FROM语句(SQL SERVER兼容性)的操作符号。以rowid作为key,建hash表,如果下层数据过来没有hash匹配项则插入到hash表,
explain update t1 set t1.c1 = tx.c2 from tx where t1.c2 = tx.c1;
#UPDATE : [0, 0, 0]; table(T1), type(select)
#TEMP TABLE SPOOL: [26, 1, 0]
#UFLT: [0, 0, 0]; IS_TOP_1(TRUE)
#PRJT2: [26, 1, 0]; exp_num(2), is_atom(FALSE)
#NEST LOOP INDEX JOIN2: [26, 1, 0]
#CSCN2: [6, 1, 0]; INDEX33555480(T1)
#CSEK2: [19, 1, 0]; scan_type(UNIQUE), INDEX33555479(TX), scan_range[T1.C2,T1.C2]
43. HIERARCHICAL QUERY (CNNTB)
用于实现层次查询。
explain select * from tx connect by prior c1 = c2 start with c3 = 0;
#NSET2: [118773, 12500000, 0]
#PRJT2: [118773, 12500000, 0]; exp_num(3), is_atom(FALSE)
#HIERARCHICAL QUERY: [118773, 12500000, 0];
#PRJT2: [23, 2500, 0]; exp_num(4), is_atom(FALSE)
#SLCT2: [23, 2500, 0]; TX.C3 = 0
#CSCN2: [23, 100000, 0]; INDEX33555479(TX)
#PRJT2: [23, 2500, 0]; exp_num(4), is_atom(FALSE)
#SLCT2: [23, 2500, 0]; var1 = exp_cast(TX.C2)
#CSCN2: [23, 100000, 0]; INDEX33555479(TX)
44. INDEX JOIN LEFT JOIN2
索引左外连接,使用右表的索引。
explain select * from t1 left join tx on t1.c1 = tx.c1;
#NSET2: [26, 1, 0]
#PRJT2: [26, 1, 0]; exp_num(5), is_atom(FALSE)
#INDEX JOIN LEFT JOIN2: [26, 1, 0]
#CSCN2: [6, 1, 0]; INDEX33555480(T1)
#CSEK2: [19, 1, 0]; scan_type(UNIQUE), INDEX33555479(TX), scan_range[T1.C1,T1.C1]
45. MPP BROADCAST
Mpp模式下,消息广播到各站点,包含必要的聚集函数合并计算
46. MPP GATHER
Mpp模式下,消息收集到主站点
47. MPP DISTRIBUTE
Mpp模式下,消息各站点的相互重分发, 一般在连接前做
48. MPP SCATTER
Mpp模式下,主站点向各从站点广播消息
49. PARALLEL
水平分区表的并行查询
50. RNSK
(Row number stop key),实现ORACLE兼容的rownum;
explain select * from tx where rownum = 10;
#NSET2: [23, 100000, 0]
#PRJT2: [23, 100000, 0]; exp_num(4), is_atom(FALSE)
#RNSK: [23, 100000, 0]; rownum = exp_cast(10)
#CSCN2: [23, 100000, 0]; INDEX33555479(TX)
51. CNTS
用于实现全文索引的CONTAINS
52. SSCN
(second index scan), 直接使用2级索引进行扫描;
explain select c2 from tx;
#NSET2: [22, 100000, 0]
#PRJT2: [22, 100000, 0]; exp_num(1), is_atom(FALSE)
#SSCN: [22, 100000, 0]; IND2(TX)
53. AFUN
分析函数计算。
explain
SELECT c1, SUM(c3) OVER (PARTITION BY c1) FROM tx;
#NSET2: [23, 100000, 0]
#PRJT2: [23, 100000, 0]; exp_num(2), is_atom(FALSE)
#AFUN: [23, 100000, 0]; afun_num(1)
#CSCN2: [23, 100000, 0]; INDEX33555479(TX)
54. PSCN/ASCN/ESCN
PSCN: 批量参数当作表来扫描
ASCN: 数组当作表来扫描
ESCN: 外部表扫描
55. DISTINCT
去重。
explain select distinct c1 from tx;
#NSET2: [22, 1000, 0]
#PRJT2: [22, 1000, 0]; exp_num(1), is_atom(FALSE)
#DISTINCT: [22, 1000, 0]
#SSCN: [22, 100000, 0]; IND2(TX)
56. HASH LEFT SEMI MUTIPLE JOIN
多列HASH左半连接, 用于实现多列IN。
explain select * from t1 where (c1, c2) not in (select c1, c2 from tx);
#NSET2: [35, 1, 0]
#PRJT2: [35, 1, 0]; exp_num(3), is_atom(FALSE)
#HASH LEFT SEMI MULTIPLE JOIN: [35, 1, 0]; (ANTI), join condition((exp11 AND exp11))
#CSCN2: [6, 1, 0]; INDEX33555480(T1)
57. REMOTE / LSET
实现外部连接(DBLINK)。
REMOTE: 远程查询;
LSET: 远程的结果集