请教关于SQL执行计划的问题

[复制链接]
查看11 | 回复6 | 2013-12-18 09:29:10 | 显示全部楼层 |阅读模式
本帖最后由 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.

回复

使用道具 举报

千问 | 2013-12-18 09:29:10 | 显示全部楼层
对。不部分这样看执行计划没错。
回复

使用道具 举报

千问 | 2013-12-18 09:29:10 | 显示全部楼层
2、查看执行计划执行步骤的方法是不是不但要先按照执行计划的最右缩进的步骤先执行

不是说最右缩进的一定最先执行。
回复

使用道具 举报

千问 | 2013-12-18 09:29:10 | 显示全部楼层
最上最右,不是最右,前提条件是最靠上的且最靠右的。这里的最靠右,是指其下没有其它步骤了。比如你的例子中3和5都是最右,但3更靠上,所以,从3开始执行。假如5下边还有一个步骤6,显然整个执行计划步骤中,第6步最靠右,但也是要从3开始执行。3执行完,执行其父步骤,父步骤执行完,看有没有和该步骤同级(同样的缩进量),若有,则执行该平级步骤下最上最右的步骤,若没有,则继续执行该步骤的父步骤。以此类推,直至每个步骤都被走到,并最终返回到0.
回复

使用道具 举报

千问 | 2013-12-18 09:29:10 | 显示全部楼层
lfree 发表于 2015-10-13 08:02
对。不部分这样看执行计划没错。

谢谢解答!

回复

使用道具 举报

千问 | 2013-12-18 09:29:10 | 显示全部楼层
bfc99 发表于 2015-10-13 09:24
最上最右,不是最右,前提条件是最靠上的且最靠右的。这里的最靠右,是指其下没有其它步骤了。比如你的例子 ...

谢谢解答!
不过你说得有点不对吧?3和5同级,如果5下面还有6,则应该先执行6,不是先执行3吧?
因为3和5同级,6属于5,6是最缩进啊,应该先执行6吧?
回复

使用道具 举报

千问 | 2013-12-18 09:29:10 | 显示全部楼层
Samdy_Chan 发表于 2015-10-13 10:23
谢谢解答!
不过你说得有点不对吧?3和5同级,如果5下面还有6,则应该先执行6,不是先执行3吧?
因为3和 ...

最上最右
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行