Using EXPLAIN PLAN 使用解释计划
本章介绍执行计划,描述SQL语句EXPLAIN PLAN,并解释如何解释其输出。 本章还提供了管理轮廓以控制应用程序性能特征的过程。
本章包含以下部分:
一:■Understanding EXPLAIN PLAN 了解解释计划
二:■The PLAN_TABLE Output Table PLAN_TABLE输出表
三:■Running EXPLAIN PLAN ■运行EXPLAIN PLAN
四:■Displaying PLAN_TABLE Output ■显示PLAN_TABLE输出
五:■Reading EXPLAIN PLAN Output ■阅读EXPLAIN PLAN输出
六:■Viewing Parallel Execution with EXPLAIN PLAN ■使用EXPLAIN PLAN查看并行执行
七:■Viewing Bitmap Indexes with EXPLAIN PLAN ■使用EXPLAIN PLAN查看位图索引
八:■Viewing Result Cache with EXPLAIN PLAN ■使用EXPLAIN PLAN查看结果缓存
九:■Viewing Partitioned Objects with EXPLAIN PLAN ■使用EXPLAIN PLAN查看分区对象
十:■PLAN_TABLE Columns ■PLAN_TABLE列
一:Understanding EXPLAIN PLAN 了解解释计划
EXPLAIN PLAN语句显示优化器为SELECT,UPDATE,INSERT和DELETE语句选择的执行计划。语句执行计划是数据库执行语句的一系列操作。
行源树是执行计划的核心。树显示以下信息:
■语句引用的表的排序
■声明中提到的每个表的访问方法
■在语句中受连接操作影响的表的联接方法
■过滤,排序或聚合等数据操作除了行源树之外,计划表还包含以下信息:
■优化,例如每项操作的成本和基数
■分区,例如一组访问的分区
■并行执行,例如连接输入的分配方法
EXPLAIN PLAN结果让您可以确定优化程序是否选择特定的执行计划,例如嵌套循环连接。结果还有助于理解优化程序的决策,例如优化程序为什么选择嵌套循环连接而不是散列连接,并让您了解查询的性能。
How Execution Plans Can Change
使用查询优化器,执行计划可以随着基础优化器输入的变化而发生变化。 EXPLAIN PLAN输出显示了在解释语句时Oracle数据库如何运行SQL语句。由于执行环境和解释计划环境的差异,此计划可能与SQL语句的实际执行计划不同。
执行计划可能因以下原因而有所不同:
■不同的架构
■不同的成本
注意:
为避免执行计划更改可能导致的SQL性能回归,请考虑使用SQL计划管理。
不同的架构:
■执行和解释计划在不同的数据库上发生。
■解释该语句的用户与运行该语句的用户不同。两个用户可能指向同一数据库中的不同对象,从而导致不同的执行计划。
■两个操作之间的架构更改(通常是索引更改)。
不同的成本:
即使模式相同,优化程序也可以在成本不同时选择不同的执行计划。影响成本的一些因素包括:
■数据量和统计信息
■绑定变量类型和值
■全局或会话级别设置的初始化参数
Minimizing Throw-Away 尽量减少丢弃
检查解释计划可让您在以下情况下寻找丢失:
■完整扫描
■非选择范围扫描
■晚期谓词过滤器
■错误的连接顺序
■延迟过滤操作
例如,在下面的解释计划中,最后一步是非常不可选的范围扫描,执行76563次,访问11432983行,丢弃99%,并保留76563行。 为什么要访问11432983行才能实现只需要76563行?
例12-1寻找解释计划中的抛弃
![](https://i-blog.csdnimg.cn/direct/52851dcb5b5141f5be6eab04fe3a2966.png)
Looking Beyond Execution Plans
超越执行计划
仅执行计划操作无法区分经过良好调整的语句和性能不佳的语句。例如,显示语句使用索引的EXPLAIN PLAN输出并不一定意味着语句有效运行。有时索引效率极低。在这种情况下,您应该检查以下内容:
■正在使用的索引的列
■它们的选择性(被访问的表的比例)
最好使用EXPLAIN PLAN来确定访问计划,然后通过测试证明它是最佳计划。在评估计划时,请检查语句的实际资源消耗。
使用V$SQL_PLAN视图
除了运行EXPLAIN PLAN命令并显示计划外,还可以使用V $ SQL_PLAN视图显示SQL语句的执行计划:
语句执行后,您可以通过查询V $ SQL_PLAN视图来显示计划。 V $ SQL_PLAN包含存储在共享SQL区域中的每个语句的执行计划。它的定义类似于PLAN_TABLE。请参阅第12-17页的“PLAN_TABLE列”。
V$SQL_PLAN优于EXPLAIN PLAN的优点是您不需要知道用于执行特定语句的编译环境。对于EXPLAIN PLAN,您需要设置相同的环境以在执行语句时获得相同的计划。
V$SQL_PLAN_STATISTICS视图提供计划中每个操作的实际执行统计信息,例如输出行数和已用时间。除输出行数外,所有统计信息都是累积的。例如,连接操作的统计信息还包括其两个输入的统计信息。 V$SQL_PLAN_STATISTICS中的统计信息可用于已使用STATISTICS_LEVEL初始化参数设置为ALL编译的游标。
V$SQL_PLAN_STATISTICS_ALL视图可以并行比较优化程序为行数和已用时间提供的估计值。 该视图结合了每个游标的V$SQL_PLAN和V$SQL_PLAN_STATISTICS信息。
解释计划限制
对于执行日期绑定变量的隐式类型转换的语句,Oracle数据库不支持EXPLAIN PLAN。 通常使用绑定变量,EXPLAIN PLAN输出可能不代表实际的执行计划。
从SQL语句的文本来看,TKPROF无法确定绑定变量的类型。 它假定类型是CHARACTER,如果不是这样,则给出错误消息。 您可以通过在SQL语句中放入适当的类型转换来避免此限制。
PLAN_TABLE输出表
PLAN_TABLE自动创建为全局临时表的公共同义词。此临时表包含所有用户的EXPLAIN PLAN语句的输出。 PLAN_TABLE是EXPLAIN PLAN语句插入描述执行计划的行的默认样本输出表。有关表中列的说明,请参见第12-17页的“PLAN_TABLE列”。
虽然为每个用户自动设置了PLAN_TABLE表,但您可以使用SQL脚本catplan.sql手动创建全局临时表和PLAN_TABLE同义词。此脚本的名称和位置取决于您的操作系统。在UNIX和Linux上,该脚本位于$ ORACLE_HOME / rdbms / admin目录中。
例如,启动SQL * Plus会话,使用SYSDBA权限连接,并按如下方式运行脚本:
@$ORACLE_HOME/rdbms/admin/catplan.sql
Oracle建议您在升级数据库版本后删除并重建本地PLAN_TABLE表,因为列可能会更改。如果要指定表,这可能导致脚本失败或导致TKPROF失败。
如果您不想使用名称PLAN_TABLE,请在运行catplan.sql脚本后创建新的同义词。例如:
CREATE OR REPLACE PUBLIC SYNONYM my_plan_table for plan_table$
运行EXPLAIN PLAN
要解释SQL语句,请在语句之前使用EXPLAIN PLAN FOR子句。 例如: