执行计划
...大约 2 分钟
执行计划
一、Oracle 执行计划
执行计划是一条查询语句在 Oracle 中的执行过程或访问路径的描述
二、PL/SQL 查看 Oracle 执行计划
2.1 配置执行计划需要显示的项
工具 —> 首选项 —> 窗口类型 —> 计划窗口 —> 根据需要配置要显示在执行计划中的列
执行计划的常用列字段解释:
基数(Rows):Oracle 估计的当前操作的返回结果集行数
字节(Bytes):执行该步骤后返回的字节数
耗费(COST)、CPU 耗费:Oracle 估计的该步骤的执行成本,用于说明 SQL 执行的代价,理论上越小越好(该值可能与实际有出入)
时间(Time):Oracle 估计的当前操作所需的时间
2.2 打开执行计划
在 SQL 窗口执行完一条 select 语句后按 F5 即可查看刚刚执行的这条查询语句的执行计划
三、分析执行计划
3.1 执行顺序
- 根据缩进来判断,缩进最多的最先执行;(缩进相同时,最上面的最先执行)
- 同一级如果某个动作没有子 ID 就最先执行
- 同一级的动作执行时遵循最上最右先执行的原则
3.2 表访问的几种方式:
图中 TABLE ACCESS BY … 即描述的是该动作执行时表访问(或者说 Oracle 访问数据)的方式
- TABLE ACCESS FULL(全表扫描)
- TABLE ACCESS BY ROWID(通过 ROWID 的表存取)
- TABLE ACCESS BY INDEX SCAN(索引扫描)
- TABLE ACCESS FULL(全表扫描)
Oracle 会读取表中所有的行,并检查每一行是否满足 SQL 语句中的 Where 限制条件;
全表扫描时可以使用多块读(即一次 I/O 读取多块数据块)操作,提升吞吐量;
数据量太大的表不建议使用全表扫描,除非本身需要取出的数据较多
- TABLE ACCESS BY ROWID(通过 ROWID 的表存取)
ROWID 是由 Oracle 自动加在表中每行最后的一列伪列,一旦一行数据插入后,则其对应的 ROWID 在该行的生命周期内是唯一的,即使发生行迁移,该行的 ROWID 值也不变,行的 ROWID 指出了该行所在的数据文件、数据块以及行在该块中的位置,所以通过 ROWID 可以快速定位到目标数据上,这也是 Oracle 中存取单行数据最快的方法;
- TABLE ACCESS BY INDEX SCAN(索引扫描)
在索引块中,既存储每个索引的键值,也存储具有该键值的行的 ROWID
所以索引扫描其实分为两步:
Ⅰ:扫描索引得到对应的 ROWID
Ⅱ:通过 ROWID 定位到具体的行读取数据
Powered by Waline v3.3.0