技术开发 频道

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

  “Execution Plan”显示优化程序用来执行查询的步骤。每一步都被赋予一个ID值(以0开始)。第二个数字显示当前操作符的父结点。在这个执行计划中,“NESTED LOOPS”的父结点是“SELECT STATEMENT”,“TABLE ACCESS (FULL) OF 'T1' (TABLE)”与“TABLE ACCESS (FULL) OF 'T2' (TABLE)”的父结点都是“NESTED LOOPS”。也可能称为,操作符“SELECT STATEMENT”的孩子结点是“NESTED LOOPS”,操作符“NESTED LOOPS”的第一个孩子结点是“TABLE ACCESS (FULL) OF 'T1' (TABLE)”,操作符“NESTED LOOPS”的第二个孩子结点是“TABLE ACCESS (FULL) OF 'T2' (TABLE)”。

  第二行表示,对表T1进行全表扫描,括号中的三个值是该步骤的成本代价,这里不作阐述。第三行表示,对T2进行全表扫描,这里还隐藏了一个细节:此处进行了c1=d1的判断。参考explain plan for生成的执行计划:

SQL>  explain plan for select /*+ USE_NL(t2) */ c1,c2 from t1 inner join t2 on c
1=d2;
Explained.
SQL
> select * from table(DBMS_XPLAN.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 4033694122
---------------------------------------------------------------------------
| Id  | Operation              | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |     2 |    78 |     4   (0)| 00:00:01 |
|   1 |  NESTED LOOPS      |      |     2 |    78 |     4   (0)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| T1   |     2 |    52 |     2   (0)| 00:00:01 |
|*  3 |   TABLE ACCESS FULL| T2   |     1 |    13 |     1   (0)| 00:00:01 |
---------------------------------------------------------------------------
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   3 - filter("C1"="D2")
Note
-----
   - dynamic sampling used for this statement
19 rows selected.
SQL
>

  这里显示的步骤0、1、2、3与前面通过set autotrace on命令显示的执行计划在意义上是一样的。红颜色表明t2只能扫描到符合过滤条件c1=d1的记录才会将控制权传给父节点“NESTED LOOPS”。

  对于该查询语句的执行,如果用代码可以描述成这样:

for (rec1 is t1’s first record; rec1!=NULL; rec1=rec1->next)
  
for(rec2 is t2’s first record; rec2!=NULL; rec2=rec->next)
   {
      
if(rec1.c1==rec2.d1)
           put  result(rec1.c1,rec1.c2) into result set;
   }
0
相关文章