PL/SQL Developer 查看查询的执行计划

https://zhuanlan.zhihu.com/p/65771352

通过 PL/SQL Developer 查看查询的执行计划

1 什么是执行计划

执行计划是一条查询语句在 Oracle 中的执行过程或访问路径的描述。2 配置执行计划需要显示的项

 

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

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

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

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

耗费(COST)、CPU 耗费:Oracle 估计的该步骤的执行成本,用于说明 SQL 执行的

代价,理论上越小越好(该值可能与实际有出入)

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

4 使用执行计划

通过工具启动执行计划。选中需要查看执行计划的查询语句,在工具栏中选择Explain Plan

或者是选择需要查看执行计划的查询语句后按 F5。

5 查看执行计划

5.1执行顺序

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

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

• TABLE ACCESS FULL(全表扫描)

• TABLE ACCESS BY INDEX ROWID(通过 ROWID 的表存取)

• TABLE ACCESS BY INDEX SCAN(索引扫描)

5.2.1TABLE ACCESS FULL(全表扫描)

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

使用建议:数据量太大的表不建议使用全表扫描,除非本身需要取出的数据较多,占到

表数据总量的 5% ~ 10% 或以上.2TABLE ACCESS BY INDEX ROWID(通过 ROWID 的

表存取)

5.2.2.1 什么是 ROWID

ROWID 是由 Oracle 自动加在表中每行最后的一列伪列,既然是伪列,就说明表中并不

会物理存储 ROWID 的值。

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

一旦一行数据插入后,则其对应的 ROWID 在该行的生命周期内是唯一的,即使发生行

迁移,该行的 ROWID 值也不变。

5.2.2.2 TABLE ACCESS BY INDEX ROWID

行的 ROWID 指出了该行所在的数据文件、数据块以及行在该块中的位置,所以通过

ROWID 可以快速定位到目标数据上,这也是 Oracle 中存取单行数据最快的方法;

5.2.3TABLE ACCESS BY INDEX SCAN(索引扫描)

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

5.2.3.1 索引扫描其实分为两步

1 扫描索引得到对应的 ROWID。

2 通过 ROWID 定位到具体的行读取数据。

5.2.3.2 五种索引扫描

• INDEX UNIQUE SCAN(索引唯一扫描)

• INDEX RANGE SCAN(索引范围扫描)

• INDEX FULL SCAN(索引全扫描)

• INDEX FAST FULL SCAN(索引快速扫描)

• INDEX SKIP SCAN(索引跳跃扫描)

5.2.3.2.1 INDEX UNIQUE SCAN(索引唯一扫描)

针对唯一性索引(UNIQUE INDEX)的扫描,每次至多只返回一条记录;

表中某字段存在 UNIQUE、PRIMARY KEY 约束时,Oracle 常实现唯一性扫描;

5.2.3.2.2INDEX RANGE SCAN(索引范围扫描)

使用一个索引存取多行数据;

发生索引范围扫描的三种情况:

1 在唯一索引列上使用了范围操作符(如:> < <> >= <= between);

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

3 对非唯一索引列上进行的任何查询;通过 PL/SQL Developer 查看查询的执行计划

1 什么是执行计划

执行计划是一条查询语句在 Oracle 中的执行过程或访问路径的描述。5.2.3.2.3INDEX FULL SCAN(索引全扫描)

进行全索引扫描时,查询出的数据都必须从索引中可以直接得到;

5.2.3.2.4INDEX FAST FULL SCAN(索引快速扫描)

扫描索引中的所有的数据块,与 INDEX FULL SCAN 类似,但是一个显著的区别是它

不对查询出的数据进行排序(即数据不是以排序顺序被返回);

5.2.3.2.5INDEX SKIP SCAN(索引跳跃扫描)

表有一个复合索引,且在查询时有除了前导列(索引中第一列)外的其他列作为条件;

5.2.4Oracle 的优化器

5.2.4.1 Oracle 的优化器种类

• RBO(Rule-Based Optimization) 基于规则的优化器

• CBO(Cost-Based Optimization) 基于代价的优化器

5.2.4.2 RBO 优化器

RBO 有严格的使用规则,只要按照这套规则去写 SQL 语句,无论数据表中的内容怎样,

也不会影响到你的执行计划。换句话说,RBO 对数据“不敏感”,它要求 SQL 编写人员必

须要了解各项细则。RBO 一直沿用至 ORACLE 9i,从 ORACLE 10g 开始,RBO 已经彻底

被抛弃。

5.2.4.3 CBO 优化器

CBO 是一种比 RBO 更加合理、可靠的优化器,在 ORACLE 10g 中完全取代 RBO。CBO

通过计算各种可能的执行计划的“代价”,即 COST,从中选用 COST 最低的执行方案作为实

际运行方案。

6 执行计划的使用

6.1单表

6.1.1分析查询表中的所有数据

6.1.1.1 示例

查询 employees 表中的所有数据.2分析主键作为条件的查询

6.1.2.1 示例

查询 employees 表中 employees_id 为 100 的雇员

6.1.3分析非主键列作为查询条件

6.1.3.1 示例

查询雇员名字为 Tarloy 的雇员.4分析 like 条件

6.1.4.1 示例

查询雇员名字中含有 a 的雇员

6.1.5分析非唯一性索引列作为条件的查询

6.1.5.1 示例一

将 last_name 创建索引

create index emp_name on

employees(last_name);

6.1.5.2 示例二

查询雇员名字为 Taylor 的雇员。

6.1.6分析非唯一性索引中=、>、< 、<>条件

6.1.6.1 示例一

对雇员薪水列做=、>、<、<>条件判断。

6.1.6.2 示例二

对薪水创建索引,使用薪水列做=、>、<、<>条件判断。

 

6.2多表

6.2.1内连接

6.2.1.1 示例一

使用等值连接,查询所有部门以及所有部门下的雇员。

6.2.1.2 示例二

使用子查询,查询所有部门以及所有部门下的雇员。

6.2.2外连接

6.2.2.1 示例一

查询所有雇员与雇员的部门名称,包含那些没有部门的雇员。

原文地址:https://www.cnblogs.com/kakaisgood/p/10948536.html