达梦数据库SQL执行计划常用操作符

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:   远程的结果集

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

保定公民

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值