SQL语言之执行计划(Oracle)

本文详细介绍了SQL语句在Oracle中的执行计划,包括如何配置显示执行计划、执行计划的列字段解释以及如何查看和理解执行计划。重点讨论了全表扫描、索引访问方式如通过rowid和索引扫描的原理与使用建议,还涵盖了Oracle的优化器RBO和CBO的工作方式。通过对执行计划的理解,有助于提升SQL查询效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

执行计划

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


一、配置执行计划需要显示的项(pl/sql developer)

在这里插入图片描述

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


基数(Cardinality):Oracle估计的当前操作的返回结果集;

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

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

时间(time):Oracle估计的当前操作所需的时间;


三、使用执行计划


通过工具启动执行计划
选中需要查看执行计划的查询语句,在工具栏中选择Tools–>Explain Plan
在这里插入图片描述

选择需要查看执行计划的查询语句后按F5;


四、查看执行计划


在这里插入图片描述

执行顺序

缩进最多的最先执行(缩进相同时,最上面的最先优先);

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

1.Table Access full(全表扫描)

2.Table Access by index rowid(通过rowid的表存取)

3.Table Access by index scan(索引扫描)

Table Access full(全表扫描)

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

使用建议

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

Table Access by index rowid(通过rowid的表存取)

1.Rowid与rownum的区别
rowid 用于定位数据表中某条数据的位置,是唯一的、也不会改变;

rownum 表示查询某条记录在整个结果集中的位置, 同一条记录查询条件不同对应的 rownum 是不同的而 rowid 是不会变的;

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

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

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

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

Table Access by index Sean(索引扫描)

1.在索引块中,既存储每个索引的键值,也存储具有该键值行的rowid;

2.索引扫描其实分为两步
扫描索引得到对应的rowid;
通过rowid定位到具体的行读取数据;

五种索引扫描

1.Index unique scan(索引唯一扫描)
针对唯一性索引(unique index)的扫描,每次至多只返回一条记录;表中某字段存在unique、primary key约束时,Oracle常实现唯一性扫描;

2.Index range scan(索引范围扫描)
使用一个索引存取多行数据;

发生索引范围说明的三种情况
在唯一索引列上使用了范围操作符(<、>、<>、>=、<=、between);

在组合索引上,只是用部分列进行查询(查询时必须包含前导列,否则会走全表扫描);

对非唯一索引列上进行的任何查询;

3.Index full scan(索引全扫描)
进行全索引扫描时,查询出的数据都必须从索引中可以直接找到;

4.Index fast full scan(索引快速扫描)
扫描索引中的所有的数据块,与index full scan类似,但是一个显著的区 别是:他不对查询出的数据进行排序(即数据不是以排序顺序返回);

5.Index skip scan(索引跳跃扫描)
表有一个复合索引,且在查询时有除了前导列(索引中的第一列)外的其 他列作为条件;

Oracle的优化器

RBO(rule-based optimization)基于规则的优化器;
CBO(cost-based optimization)至于代价的优化器;
1.RBO优化器
有严格的使用规则,只要按照这套规则去写SQL语句,无论数据表中的内 容怎样,也不会影响到执行计划。换句话说,rbo对数据“不敏感”,它 要求SQL编写任意必须要了解各项细则。Rbo一直沿用值Oracle9i,从 Oracle10g开始,rbo已经彻底被抛弃;

2.CBO优化器
一种比rbo更加合理、可靠的优化器,在Oracle10g中完全取代了rbo。 Cbo通过计算各种可能的执行计划的“代价”,即cost,从中选用cost最 低的执行方案作为实际运行方案;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值