本帖最后由 Samdy_Chan 于 2015-10-13 00:48 编辑
各位好:
请问如下这段使用排序合并的执行计划的顺序怎么看呢?
是不是先执行| 3 |TABLE ACCESS FULL| EMP_TEMP1 | 这一步进行 EMP_TEMP1全表扫描(未排序),
然后执行 | 2 |SORT JOIN |这一步将EMP_TEMP1表按empno列进行排序,
再执行 | 5 |TABLE ACCESS FULL| EMP_TEMP| 这一步进行 EMP_TEMP全表扫描(未排序),
接着执行 |* 4 |SORT JOIN | |这一步将EMP_TEMP表按empno列进行排序,
最后执行 | 1 |MERGE JOIN | |这一步,将 EMP_TEMP1 和 EMP_TEMP 两个表排序后的数据按 empno 连接列进行合并。
请问:
1、我上面分析的执行计划的执行顺序步骤每一步和分析都正确吗?如有错误,可以给出正确详细的执行步骤给我参考一下吗?
2、查看执行计划执行步骤的方法是不是不但要先按照执行计划的最右缩进的步骤先执行,然后再结合 v$sql_plan,执行该缩进步骤的上一个 parent_id?(如最下 紫色字体 的 v$sql_plan 查询结果)。
小弟菜鸟一个,对这个比较感兴趣,有疑问。
以上两个问题,还望各位大侠能详细帮忙解答一下吗?
衷心感谢!
21:55:42 SCOTT@orcl*SQL > select t1.mgr,t2.deptno from emp_temp t1,emp_temp1 t2
21:56:03 2where t1.empno=t2.empno;
Elapsed: 00:00:00.00
Execution Plan
----------------------------------------------------------
Plan hash value: 1323777565
-----------------------------------------
| Id| Operation | Name|
-----------------------------------------
| 0 | SELECT STATEMENT| |
| 1 |MERGE JOIN | |
| 2 |SORT JOIN | |
| 3 |TABLE ACCESS FULL| EMP_TEMP1 |
|* 4 |SORT JOIN | |
| 5 |TABLE ACCESS FULL| EMP_TEMP|
-----------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
4 - access("T1"."EMPNO"="T2"."EMPNO")
filter("T1"."EMPNO"="T2"."EMPNO")
Note
-----
- rule based optimizer used (consider using cbo)
21:57:00 SYS@orcl*SQL > select parent_id, lpad(' ', 2*(level-1))||operation "Operation", options "Options",
21:57:12 2decode(to_char(id), '0', 'Cost='||nvl(to_char(position), 'n/a'), object_name) "Object Name",
21:57:12 3substr(optimizer, 1, 6) "Optimizer"
21:57:12 4from v$sql_plan a
21:57:12 5start with address = '2BA6E874'
21:57:12 6and id = 0
21:57:12 7connect by prior id = a.parent_id
21:57:12 8and prior a.address = a.address
21:57:12 9and prior a.hash_value = a.hash_value;
PARENT_ID Operation
OptionsObject Name Optimizer
-------------------- ---------------------------------------- ------------ --------------- ------------------------------------------------
SELECT STATEMENT
Cost=n/aRULE
0 MERGE JOIN
1 SORT
JOIN
2 TABLE ACCESS
FULL EMP_TEMP1
1 SORT
JOIN
4 TABLE ACCESS
FULL EMP_TEMP
6 rows selected.
|