前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SELECT和DELETE执行计划的不同选择

SELECT和DELETE执行计划的不同选择

作者头像
bisal
发布2019-10-27 00:17:38
8060
发布2019-10-27 00:17:38
举报

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/bisal/article/details/102735217

模拟表名,A表的数据量约1000万,B表的数据量约500万,进行连接,其中这几个条件字段,都创建了索引,

代码语言:javascript
复制
SQL> SELECT * from A a inner join B b on a.ID = b.id
     where b.C_DATE <= trunc(sysdate)-1000;

我们知道在CBO优化器模式下,Oralce会基于Cost成本,来选择执行计划。从执行计划看,全表扫描用的Hash Join,被驱动表只扫描一次,HINT使用索引则用的嵌套循环连接Nested Loop,两个表的记录都很多,哪个表做被驱动表都会导致扫描次数过多,回表也过多,而且索引的CF高,索引扫描的成本,会更高些,SELECT返回所有列,需要考虑回表,因此干脆不回表,选择全表扫描,从Cost能看出,HINT索引的值更高。

从10053能看到SELECT的执行计划成本计算,根本没考虑索引,鉴于SELECT *和较高的CF,能不回表就不回表了,

代码语言:javascript
复制
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------
| Id  | Operation                      | Name          | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------------
|   0 | DELETE STATEMENT               |               | 10000 |   195K|  5040   (1)| 00:01:01 |
|   1 |  DELETE                        | A             |       |       |            |          |
|*  2 |   COUNT STOPKEY                |               |       |       |            |          |
|   3 |    NESTED LOOPS                |               | 85666 |  1673K|  5040   (1)| 00:01:01 |
|   4 |     TABLE ACCESS BY INDEX ROWID| B             | 85666 |  1171K|  5034   (1)| 00:01:01 |
|*  5 |      INDEX RANGE SCAN          | IDX_B_01      | 85666 |       |   232   (1)| 00:00:03 |
|*  6 |     INDEX UNIQUE SCAN          | PK_A_ID       |     1 |     6 |     0   (0)| 00:00:01 |
------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter(ROWNUM<=10000)
   5 - access("B"."C_DATE"<=TRUNC(SYSDATE@!)-1000)
   6 - access("A"."ID"="B"."ID")

DELETE的时候,毕竟要删除数据,因此回表势在必行的,只能在回表的各种路径中找一个合适的,所以会考虑索引路径,

640?wx_fmt=png
640?wx_fmt=png

SELECT和DELETE即使条件相同,相应的执行计划,可能还是有差别,归根结底在于Cost的计算和判断,如上例所示,可能会考虑是否需要回表、CF值高低等因素,所以Oracle在这方面还是很智能的,优化器的算法,作为他的核心商业机密,也就不足为奇了。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-10-24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档