3.使用唯一索引的嵌套连接的执行计划该如何理解?
测试数据与1中描述的一样。删除原来的非唯一索引,建立唯一索引:
drop index it2d1;
create unique index iut2d1 on t2(d1);
create unique index iut2d1 on t2(d1);
查询语句:
select /*+ index(t2) */ c1,c2,d1 from t1 inner join t2 on c1=d1;
对应的执行计划:
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=2 Card=2 Bytes=78)
1 0 NESTED LOOPS (Cost=2 Card=2 Bytes=78)
2 1 TABLE ACCESS (FULL) OF 'T1' (TABLE) (Cost=2 Card=2 Bytes
=52)
3 1 INDEX (UNIQUE SCAN) OF 'IUT2D1' (INDEX (UNIQUE)) (Cost=0
Card=1 Bytes=13)
1 0 NESTED LOOPS (Cost=2 Card=2 Bytes=78)
2 1 TABLE ACCESS (FULL) OF 'T1' (TABLE) (Cost=2 Card=2 Bytes
=52)
3 1 INDEX (UNIQUE SCAN) OF 'IUT2D1' (INDEX (UNIQUE)) (Cost=0
Card=1 Bytes=13)
数据库执行该执行语句的步骤也是类似的,下面是执行该执行语句的步骤:
1) TAF(T1)(“TABLE ACCESS (FULL) OF 'T1'”的简写)取得表T1的第一条记录(1,1)传递给NL(“NESTED LOOPS”的简写),将控制权传递给NL。
2) 操作符NL将控制权传递给第二个孩子IUS(IUT2D1)(“INDEX (UNIQUE SCAN) OF 'IUT2D1''”的简写)。
3) IUS(IUT2D1)使用键值(1)去命中索引IUT2D1对应的B树,得到索引记录(1,rowid1)。将d1对应的数据(1)传递给NL,将控制权传递给NL。
4) 操作NL组合生成记录(1,1,1)(对应select项(c1,c2,d1))传给SS,将控制权传给SS。
5) 操作符SS将记录(1,1,1)放入结果集,将控制权传给NL。
6) NL控制权传给TAF(T1)。因为iut2d1是唯一索引,所以只可能有一条记录满足d1=1,所以此时不需要将控制权限再传给IUS(IUT2D1)。
7) TAF(T1)取得下一条记录(2,2)传递给NL,将控制权传给NL。
8) NL将控制权传给IRS(IUT2D1)。
9) IUS(IUT2D1)使用键值(2)去命中索引IUT2D1对应的B树,得到索引记录(2,rowid2)。将d1对应的数据(2)传递给NL,将控制权传递给NL。
10) 操作NL组合生成记录(2,2,2)传给SS,将控制权传给SS。
11) 操作符SS将记录(2,2,2)放入结果集,将控制权传给NL。
12) NL控制权传给TAF(T1)。
13) TAF(T1)取得下一条记录,发现已经扫描结束,通知NL扫描结束,将控制权传给NL。
14) NL通知SS扫描结束,将控制权传给SS。
15) SS将结果集(包含记录(1,1,1)、(2,2,2))发送给客户端。
2) 操作符NL将控制权传递给第二个孩子IUS(IUT2D1)(“INDEX (UNIQUE SCAN) OF 'IUT2D1''”的简写)。
3) IUS(IUT2D1)使用键值(1)去命中索引IUT2D1对应的B树,得到索引记录(1,rowid1)。将d1对应的数据(1)传递给NL,将控制权传递给NL。
4) 操作NL组合生成记录(1,1,1)(对应select项(c1,c2,d1))传给SS,将控制权传给SS。
5) 操作符SS将记录(1,1,1)放入结果集,将控制权传给NL。
6) NL控制权传给TAF(T1)。因为iut2d1是唯一索引,所以只可能有一条记录满足d1=1,所以此时不需要将控制权限再传给IUS(IUT2D1)。
7) TAF(T1)取得下一条记录(2,2)传递给NL,将控制权传给NL。
8) NL将控制权传给IRS(IUT2D1)。
9) IUS(IUT2D1)使用键值(2)去命中索引IUT2D1对应的B树,得到索引记录(2,rowid2)。将d1对应的数据(2)传递给NL,将控制权传递给NL。
10) 操作NL组合生成记录(2,2,2)传给SS,将控制权传给SS。
11) 操作符SS将记录(2,2,2)放入结果集,将控制权传给NL。
12) NL控制权传给TAF(T1)。
13) TAF(T1)取得下一条记录,发现已经扫描结束,通知NL扫描结束,将控制权传给NL。
14) NL通知SS扫描结束,将控制权传给SS。
15) SS将结果集(包含记录(1,1,1)、(2,2,2))发送给客户端。