以下是引用片段: #RSET:[0, 0, 0]; #XFLT:[0, 0, 0]; IsGreatZero(Expr3) #XNLP:[0, 0, 0]; CROSS_JOIN #CSEK:[0, 0, 0]; INDEX33555528(t1), FULL_SCAN #XRCS:[0, 0, 0]; #XFLT:[0, 0, 0]; EXPR2 < EXPR0 #CSEK:[21, 1, 1]; INDEX33555522(T2), FULL_SCAN |
从执行计划看出,首先扫描t1表,然后从t1表取出一条记录,与t2表进行嵌套连接,条件是d1录进行查询,直到t1表搜索完全。使用XNLP的约束是如果两表的列进行连接,则不可以是等值连接。类似下面语句均可以用到XNLP连接
以下是引用片段: select * from t1 where exists ( select * from t2 where d2 select * from t1 where exists ( select * from t2) select * from t1 where exists ( select 1) |
(2) HNLP
HNLP操作符的含义是哈希半连接,产生的条件是:两表进行等值连接,并且子查询中的表使用的是未建索引的列。
例如:
以下是引用片段: create table t1(c1 int,c2 int); create table t2(d1 int,d2 int); create index it1c1 on t1(c1); create index it2d1 on t2(d1); select * from t1 where exists(select * from t2 where d2=c1); |
执行计划:
以下是引用片段: #RSET:[0, 0, 0]; #HNLP:[0, 0, 0]; #CSEK:[0, 0, 0]; INDEX33556678(t1), FULL_SCAN #CSEK:[21, 1, 1]; INDEX33556647(t2), FULL_SCAN |
分析:从执行计划看出,尽管t2表中建有索引,但是未使用d1列进行连接。执行过程是全表扫描t1表,以c1列为键值,使用哈希函数,将t1表的数据装入散列桶,对于t2表每条数据d2采用相同的散列函数计算出相应的散列值,进行查找,如果命中,则返回该记录,否则取t1表下一条记录重复操作,直到t1表扫描完毕。
(3) SNLP
SNLP操作符为索引半连接,产生条件是子查询的表中建有索引。
例如:
以下是引用片段: create table t1(c1 int,c2 int); create table t2(d1 int,d2 int); create index it2d1 on t2(d1); select * from t1 where c1 in (select d1 from t2); |
执行计划:
以下是引用片段: #RSET:[20, 1, 0]; #SNLP:[20, 1, 0]; #CSEK:[20, 1, 0]; INDEX33556696(t1), FULL_SCAN #CSEK(SECOND):[0, 0, 0]; it2d1(t2), INDEX_EQU_SEARCH |
分析:从执行计划看出,t2表建有索引,对t2表采用索引等值查询,执行过程为t1表过来一条记录,以c1列值为key,在t2表中使用索引扫描,如果找到一条记录就返回t1表当前行到结果集,然后取t1表下一条记录,重复上述查询过程,直到t1表搜索完毕。
(4) SMRG
SMRG操作符是m