查看: 25054|回复: 34

[精华] DM7的常用操作符

[复制链接]
论坛徽章:
6
2012新春纪念徽章
日期:2012-01-04 11:53:292013年新春福章
日期:2013-02-25 14:51:24林肯
日期:2013-09-12 15:57:33优秀写手
日期:2013-12-18 09:29:09慢羊羊
日期:2015-03-04 14:51:352015年新春福章
日期:2015-03-06 11:57:31
发表于 2012-11-1 21:56 | 显示全部楼层 |阅读模式
本帖最后由 pkmonster 于 2012-11-1 21:57 编辑

DM7系统有几十个SQL操作符, 它们是查询计划的构成元素, 运行时完成数据的抽取与加工。

供关注达梦的同学参考。

为了便于说明,先创建4个表:
create table t1(c1 int, c2 int);
create table t2(c1 int, c2 int);
create table t3(c1 int primary key, c2 int);
create table tx(c1 int, c2 varchar(100), c3 int, cluster primary key(c1));
/* tx 插点数据 */
begin
   for i in 1..100000 loop
      insert into tx values(i, 'aaaaaaa', i);
    end loop;
   
   commit;
end;

操作符如果有两个儿子,则称为二元操作符,如果只有一个儿子,则称为一元操作符;没有儿子的操作符号是叶子,一般是数据扫描节点。

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


认证徽章
论坛徽章:
43
现任管理团队成员
日期:2011-05-07 01:45:08ITPUB元老
日期:2012-09-12 14:50:28版主5段
日期:2014-06-11 02:21:31阿斯顿马丁
日期:2013-11-19 10:38:16祖母绿
日期:2012-11-06 12:43:12路虎
日期:2013-11-20 11:37:53雪佛兰
日期:2013-09-05 13:28:25ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512015中国数据库技术大会纪念徽章
日期:2015-04-24 16:04:24秀才
日期:2015-05-26 13:32:07
发表于 2012-11-1 22:00 | 显示全部楼层
先顶再学习

使用道具 举报

回复
论坛徽章:
1
优秀写手
日期:2013-12-18 09:29:15
发表于 2012-11-1 22:08 | 显示全部楼层
占广告位。。。

使用道具 举报

回复
认证徽章
论坛徽章:
169
SQL数据库编程大师
日期:2016-01-13 10:30:43SQL极客
日期:2013-12-09 14:13:35SQL大赛参与纪念
日期:2013-12-06 14:03:45最佳人气徽章
日期:2015-03-19 09:44:03现任管理团队成员
日期:2015-08-26 02:10:00秀才
日期:2015-07-28 09:12:12举人
日期:2015-07-13 15:30:15进士
日期:2015-07-28 09:12:58探花
日期:2015-07-28 09:12:58榜眼
日期:2015-08-18 09:48:03
发表于 2012-11-1 22:36 | 显示全部楼层
后学习而先顶!

使用道具 举报

回复
论坛徽章:
1
2012新春纪念徽章
日期:2012-01-04 11:58:44
发表于 2012-11-1 22:44 | 显示全部楼层
厉害 完全自主不是吹的

使用道具 举报

回复
认证徽章
论坛徽章:
169
SQL数据库编程大师
日期:2016-01-13 10:30:43SQL极客
日期:2013-12-09 14:13:35SQL大赛参与纪念
日期:2013-12-06 14:03:45最佳人气徽章
日期:2015-03-19 09:44:03现任管理团队成员
日期:2015-08-26 02:10:00秀才
日期:2015-07-28 09:12:12举人
日期:2015-07-13 15:30:15进士
日期:2015-07-28 09:12:58探花
日期:2015-07-28 09:12:58榜眼
日期:2015-08-18 09:48:03
发表于 2012-11-1 23:16 | 显示全部楼层
myth8860 发表于 2012-11-1 22:00
先顶再学习

啥时候散分通知下!

使用道具 举报

回复
认证徽章
论坛徽章:
122
凯迪拉克
日期:2013-12-04 15:20:03红旗
日期:2013-12-04 15:20:03夏利
日期:2013-12-04 15:20:03福特
日期:2013-12-04 15:20:032010新春纪念徽章
日期:2015-03-26 14:15:332009新春纪念徽章
日期:2009-01-04 14:52:282009日食纪念
日期:2009-07-22 09:30:00ITPUB 11周年纪念徽章
日期:2012-10-09 18:09:192013年新春福章
日期:2015-03-28 23:18:10雪佛兰
日期:2013-12-04 15:56:35
发表于 2012-11-1 23:16 | 显示全部楼层
学习学习

使用道具 举报

回复
认证徽章
论坛徽章:
43
现任管理团队成员
日期:2011-05-07 01:45:08ITPUB元老
日期:2012-09-12 14:50:28版主5段
日期:2014-06-11 02:21:31阿斯顿马丁
日期:2013-11-19 10:38:16祖母绿
日期:2012-11-06 12:43:12路虎
日期:2013-11-20 11:37:53雪佛兰
日期:2013-09-05 13:28:25ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512015中国数据库技术大会纪念徽章
日期:2015-04-24 16:04:24秀才
日期:2015-05-26 13:32:07
发表于 2012-11-2 19:13 | 显示全部楼层
Naldonado 发表于 2012-11-1 23:16
啥时候散分通知下!

好,要多关注

使用道具 举报

回复
论坛徽章:
401
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
发表于 2012-11-3 17:39 | 显示全部楼层
分区有关的只有一个parallel?

使用道具 举报

回复
招聘 : 数据库管理员
认证徽章
论坛徽章:
38
2010新春纪念徽章
日期:2010-03-01 11:19:10ITPUB社区OCM联盟徽章
日期:2014-03-19 09:57:09问答徽章
日期:2014-03-17 09:53:582014年新春福章
日期:2014-02-18 16:43:09优秀写手
日期:2013-12-18 09:29:14奔驰
日期:2013-11-29 09:43:42阿斯顿马丁
日期:2013-11-19 10:38:162013年新春福章
日期:2013-02-25 14:51:24奥运会纪念徽章:游泳
日期:2012-09-11 12:38:112012新春纪念徽章
日期:2012-02-13 15:11:52
发表于 2012-11-3 20:24 | 显示全部楼层
这个看来是DM的核心研发了,上面这些操作符之前看执行计划的时候就想知道每个具体代表哪个操作,这贴搜藏先。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表