一文看懂Oracle的执行计划.docVIP

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

PAGE

PAGE1

一文看懂Oracle的执行计划

标签:INDEXSCAN扫描索引计划ROWIDOracle执行

一:什么是Oracle执行计划?

执行计划是一条查询语句在Oracle中的执行过程或访问路径的描述

二:怎样查看Oracle执行计划?

因为我一直用的PLSQL远程连接的公司数据库,所以这里以PLSQL为例:

①:配置执行计划需要显示的项:

工具mdash;首选项mdash;窗口类型mdash;计划窗口mdash;根据需要配置要显示在执行计划中的列

执行计划配置

执行计划的常用列字段解释:

基数(Rows):Oracle估计的当前操作的返回结果集行数

字节(Bytes):执行该步骤后返回的字节数

耗费(COST)、CPU耗费:Oracle估计的该步骤的执行成本,用于说明SQL执行的代价,理论上越小越好(该值可能与实际有出入)

时间(Time):Oracle估计的当前操作所需的时间

②:打开执行计划:

在SQL窗口执行完一条select语句后按F5即可查看刚刚执行的这条查询语句的执行计划

执行计划查看

注:在PLSQL中使用SQL命令查看执行计划的话,某些SQL*PLUS命令PLSQL无法支持,比如SETAUTOTRACEON

三:看懂Oracle执行计划

看懂执行计划

①:执行顺序:

根据Operation缩进来判断,缩进最多的最先执行;(缩进相同时,最上面的最先执行)

例:上图中INDEXRANGESCAN和INDEXUNIQUESCAN两个动作缩进最多,最上面的INDEXRANGESCAN先执行;

同一级如果某个动作没有子ID就最先执行

同一级的动作执行时遵循最上最右先执行的原则

例:上图中TABLEACCESSBYGLOBALINDEXROWID和TABLEACCESSBYINDEXROWID两个动作缩进都在同一级,则位于上面的TABLEACCESSBYGLOBALINDEXROWID这个动作先执行;这个动作又包含一个子动作INDEXRANGESCAN,则位于右边的子动作INDEXRANGESCAN先执行;

图示中的SQL执行顺序即为:

INDEXRANGESCANmdash;TABLEACCESSBYGLOBALINDEXROWIDmdash;INDEXUNIQUESCANmdash;TABLEACCESSBYINDEXROWIDmdash;NESTEDLOOPSOUTERmdash;SORTGROUPBYmdash;SELECTSTATEMENT,GOAL=ALL_ROWS

(注:PLSQL提供了查看执行顺序的功能按钮(上图中的红框部分))

②:对图中动作的一些说明:

上图中TABLEACCESSBY即描述的是该动作执行时表访问(或者说Oracle访问数据)的方式;

表访问的几种方式:(非全部)

TABLEACCESSFULL(全表扫描)

TABLEACCESSBYROWID(通过ROWID的表存取)

TABLEACCESSBYINDEXSCAN(索引扫描)

引扫描)

(1)TABLEACCESSFULL(全表扫描):

Oracle会读取表中所有的行,并检查每一行是否满足SQL语句中的Where限制条件;

全表扫描时可以使用多块读(即一次I/O读取多块数据块)操作,提升吞吐量;

使用建议:数据量太大的表不建议使用全表扫描,除非本身需要取出的数据较多,占到表数据总量的5%~10%或以上

(2)TABLEACCESSBYROWID(通过ROWID的表存取):

先说一下什么是ROWID?

ROWID是由Oracle自动加在表中每行最后的一列伪列,既然是伪列,就说明表中并不会物理存储ROWID的值;

你可以像使用其它列一样使用它,只是不能对该列的值进行增、删、改操作;

一旦一行数据插入后,则其对应的ROWID在该行的生命周期内是唯一的,即使发生行迁移,该行的ROWID值也不变。

让我们再回到TABLEACCESSBYROWID来:

行的ROWID指出了该行所在的数据文件、数据块以及行在该块中的位置,所以通过ROWID可以快速定位到目标数据上,这也是Oracle中存取单行数据最快的方法;

(3)TABLEACCESSBYINDEXSCAN(索引扫描):

在索引块中,既存储每个索引的键值,也存储具有该键值的行的ROWID。

一个数字列上建索引后该索引可能的概念结构如下图:

所以索引扫描其实分为两步:

Ⅰ:扫描索引得到对应的ROWID

Ⅱ:通过RO

文档评论(0)

177****3143 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档