求助如何判断执行计划优劣,这两个执行计划哪个好一些?

小灯光环
领域专家: 操作系统技术领域
2016-08-04 09:10:22
查询的数据是一样的,只是SQL写法不同,刚接触这块不太会看,求指点

第一个执行计划:
1 Plan hash value: 3456858857
2
3 ------------------------------------------------------------------------------------------------
4 | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
5 ------------------------------------------------------------------------------------------------
6 | 0 | SELECT STATEMENT | | 11772 | 218K| 207 (1)| 00:00:03 |
7 | 1 | TABLE ACCESS BY INDEX ROWID| T_STUDENTSCORE | 1 | 19 | 2 (0)| 00:00:01 |
8 |* 2 | INDEX RANGE SCAN | IDX_STUDENTSCORE | 1 | | 1 (0)| 00:00:01 |
9 |* 3 | TABLE ACCESS FULL | T_GRADUATESCHOOL | 1 | 15 | 3 (0)| 00:00:01 |
10 | 4 | TABLE ACCESS FULL | T_STUDENTINFO | 11772 | 218K| 207 (1)| 00:00:03 |
11 ------------------------------------------------------------------------------------------------
12
13 Predicate Information (identified by operation id):
14 ---------------------------------------------------
15
16 2 - access("SC"."BMH_"=SYS_OP_C2C(:B1))
17 3 - filter("GS"."SCHOOLCODE_"=:B1)


第二个执行计划:
1 Plan hash value: 692932517
2
3 -------------------------------------------------------------------------------------------
4 | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
5 -------------------------------------------------------------------------------------------
6 | 0 | SELECT STATEMENT | | 11772 | 609K| 244 (2)| 00:00:03 |
7 |* 1 | HASH JOIN RIGHT OUTER | | 11772 | 609K| 244 (2)| 00:00:03 |
8 | 2 | TABLE ACCESS FULL | T_STUDENTSCORE | 11642 | 216K| 32 (0)| 00:00:01 |
9 |* 3 | HASH JOIN RIGHT OUTER| | 11772 | 390K| 211 (1)| 00:00:03 |
10 | 4 | TABLE ACCESS FULL | T_GRADUATESCHOOL | 39 | 585 | 3 (0)| 00:00:01 |
11 | 5 | TABLE ACCESS FULL | T_STUDENTINFO | 11772 | 218K| 207 (1)| 00:00:03 |
12 -------------------------------------------------------------------------------------------
13
14 Predicate Information (identified by operation id):
15 ---------------------------------------------------
16
17 1 - access("SC"."BMH_"(+)=SYS_OP_C2C("STU"."BMH_"))
18 3 - access("STU"."SCHOOLCODE_"="GS"."SCHOOLCODE_"(+))

...全文
278 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
jdsnhan 2016-08-11
  • 打赏
  • 举报
回复
从结果上看呗。 看谁的cost消耗低,他就是快的。 一般情况下, TABLE ACCESS BY INDEX ROWID数据访问方式速度比较快
ghx287524027 2016-08-10
  • 打赏
  • 举报
回复
引用 2 楼 wlwlwlwl015 的回复:
[quote=引用 1 楼 ghx287524027 的回复:] 但从执行计划上看应该是第一个好一点,不过还得依据你的表结构、数据量以及需求情况来做进一步比较。
再请教一下SELECT STATEMENT这一列 一个是 HASH JOIN RIGHT OUTER 一个是TABLE ACCESS BY INDEX ROWID 这能否说明哪个好一些呢?这一列具体代表的是什么意思[/quote] HASH JOIN RIGHT OUTER 和 TABLE ACCESS BY INDEX ROWID 只是两种不同的检索数据的方式,没有绝对的谁好谁坏之说。 根据你贴出的执行计划,无论是从cost还是rows的信息上看,都是第一种方式比较好一些。如果想深入了解的话,可以利用10053事件生成一个trace,里面记录着执行计划的生成过程。
桃花岛黄岛主 2016-08-10
  • 打赏
  • 举报
回复
引用 2 楼 wlwlwlwl015 的回复:
[quote=引用 1 楼 ghx287524027 的回复:] 但从执行计划上看应该是第一个好一点,不过还得依据你的表结构、数据量以及需求情况来做进一步比较。
再请教一下SELECT STATEMENT这一列 一个是 HASH JOIN RIGHT OUTER 一个是TABLE ACCESS BY INDEX ROWID 这能否说明哪个好一些呢?这一列具体代表的是什么意思[/quote] 第一个是HASHJOIN 第二个应该是NESTLOOP,这两种方法本身没有优劣之分,有各自不同的应用场景,具体要根据具体的数据,逻辑,等等
小灯光环 2016-08-10
  • 打赏
  • 举报
回复
引用 1 楼 ghx287524027 的回复:
但从执行计划上看应该是第一个好一点,不过还得依据你的表结构、数据量以及需求情况来做进一步比较。
再请教一下SELECT STATEMENT这一列 一个是 HASH JOIN RIGHT OUTER 一个是TABLE ACCESS BY INDEX ROWID 这能否说明哪个好一些呢?这一列具体代表的是什么意思
ghx287524027 2016-08-05
  • 打赏
  • 举报
回复
但从执行计划上看应该是第一个好一点,不过还得依据你的表结构、数据量以及需求情况来做进一步比较。

17,134

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧