例如:
以下是引用片段: create table t1(c1 int,c2 int); create table t2(d1 int,d2 int); create index it2d1 on t2(d1); select * from t1 where exists (select d1 from t2 where c1=d1); |
执行计划:
以下是引用片段: #RSET:[0, 0, 0]; #SMRG:[0, 0, 0]; #XSORT:[0, 0, 0]; keys_num(1), is_distinct(FALSE) #CSEK:[0, 0, 0]; INDEX33555528(t1), FULL_SCAN #CSEK:[11, 1, 1]; it2d1(T2), INDEX_GE_SEARCH |
分析:从执行计划看出,首先对t1表以c1列为key进行排序,t2表使用索引扫描,由于t1表、t2表均为有序表,该子查询转换为归并半连接,t1表取第一条记录与t2表记录比较,如果t2表中存在一条c1=d1的记录,则将t1表当前行输出到结果集,继续取t1表下一条记录,同时t2表继续从下一行开始向后扫描;否则,t1、t2表同时将游标指向下一条记录,重复上述操作。直到t1表或者t2表扫描完毕即结束,一趟扫描即可完成。
以上是对达梦数据库中in\exists子查询的简单分析,在具体的实际应用中,可以根据情况进行转化,提高语句的执行效率。