技术开发 频道

数据库性能调优技术之嵌套循环执行计划

  也就是说,t1与t2先生成笛卡尔集,然后过过滤条件c1=d1过滤该笛卡尔集。

  其实,数据库执行该语句的步骤也是类似的,下面是执行该语句的步骤:

1) TAF(T1)(“TABLE ACCESS (FULL) OF 'T1'”的简写)取得T1的第一条记录(1,1)传递给NL(“NESTED LOOPS”的简写),将控制权传递给操作符NL。
2) 操作符NL将控制权传给第二个孩子TAF(T2)(“TABLE ACCESS (FULL) OF 'T2'”的简写)。
3) TAF(T2)取得T2的第一条记录(1,1),符合过滤条件c1=d1,将控制权传给操作符NL。
4) NL将记录(1,1)传给SS(“SELECT STATEMENT”的简写),将控制权传给SS。
5) SS将记录(1,1)放入结果集合,将控制权限传给NL。
6) NL将控制权限传给TAF(T2)。
7) TAF(T2)取得T2表的下一条记录(22),不符合条件c1=d1;取得下一条记录(3,3),不符合条件(44)。取得下一条记录,取不到记录。T2表扫描结束。将控制权限传递给NL。
8) NL将控制权限传给第一个孩子TAF(T1)。
9) TAF(T1)取得T1表的下一条记录(22)传递给NL,将控制权传给NL。
10) NL将控制权传给第二个孩子TAF(T2)。
11) TAF(T2)取得T2的第一条(11),不符合过滤条件c1=d1;取得下一条记录(22),满足条件c1=d1,将控制权传给操作符NL。
12) NL将记录(22)传给SS,将控制权传给SS。
13) SS将记录(22)放入结果集,将控制权传给NL。
14) NL将控制权限传给TAF(T2)。
15) TAF(T2)取得T2的下一条记录(3,3),不符合过滤条件c1=d1;取得下一条记录(44),不符合过滤条件c1=d1;取得下一条记录,取不到记录。T2表扫描结束。将控制权限传递给NL。
16) NL将控制权限传给第一个孩子TAF(T1)。
17) TAF(T1)取得T1表的下一条记录,取不到记录,T1表扫描结束。将控制权传给NL,通知NL扫描结束。
18) NL将控制权限传给SS,通知SS操作结束。
19) SS将结果集(包含记录(11)、(22))发送给客户端。

  在上面的例子中,只查询显示t1的列,如果要显示t2的列,情况是一样,只是TAF(T2)需要将符合条件的T2记录传递给NL,然后NL组合成符合条件的(c1,c2,d1,d2)传递给SS。

select /*+ USE_NL(t2) */ c1,c2,d1,d2 from t1 inner join t2 on c1=d2;

  对应的执行计划:

0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=4 Card=2 Bytes=104
          )
  
1    0   NESTED LOOPS (Cost=4 Card=2 Bytes=104)
  
2    1     TABLE ACCESS (FULL) OF 'T1' (TABLE) (Cost=2 Card=2 Bytes
          
=52)
  
3    1     TABLE ACCESS (FULL) OF 'T2' (TABLE) (Cost=1 Card=1 Bytes
          
=26)
0