• 达梦数据库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: 远程的结果集

  • 相关阅读:
    JAVA(五)反射机制/Annotation
    JAVA(四)类集/枚举
    JAVA(三)JAVA常用类库/JAVA IO
    JAVA(二)异常/包及访问权限/多线程/泛型
    JAVA(一)JAVA基础/面向对象基础/高级面向对象
    【Android】Android输入子系统
    【Linux】深入理解Linux中内存管理
    【XMPP】基于XMPP的即时通讯解决方案
    cf593d
    cf593c
  • 原文地址:https://www.cnblogs.com/hushaojun/p/16494361.html
Copyright © 2020-2023  润新知