获取执行计划
基本上,Oracle
Database提供五种方法来获取与某个SQL语句关联的执行计划。
Ø 执行EXPLAIN PLAN语句然后查询其输出所写入的表。
Ø 查询动态性能视图来显示缓存在库缓存中的执行计划。
Ø 使用实时监控(Real-time Monitoring)来获取关于正在执行或刚刚执行完毕的SQL语句的信息。
Ø 查询自动工作负载存储库(AWR)或statspack表,显示存储在存储库中的执行计划。
Ø 激活跟踪功能提供执行计划。
尽管还有其他获取执行计划的方法(例如,在第11章中会讲到,通过与SQL探查和SQL计划基线相关的特性),但是那些方法无法直接用来获取一个与给定SQL语句关联的执行计划。
因为所有显示执行计划的工具都是利用刚才所列的五种方法之一,接下来的内容只会讲述基础知识而不会关注某个具体的工具,例如Oracle Enterprise Manager、PL/SQLDeveloper或 Toad等。不讨论这些工具的原因还有,多半情况下,它们无法提供进行一个完全分析所需的全部信息。
EXPLAIN PLAN语句
EXPLAIN PLAN的目标是接受一个SQL语句作为输入,然后提供它的执行计划和相关信息,并在计划表中作为输出显示。换句话说,通过这个语句可以询问查询优化器,什么样的执行计划将用于给定SQL语句的执行。
图10-1展示了EXPLAIN PLAN语句的语法。可用的参数如下。
Ø statement指定应该为哪一条SQL语句提供执行计划。支持的SQL语句如下:select、INSERT、UPDATE、MERGE、DELETE、CREATE TABLE、CREATE INDEX 以及 ALTER INDEX。
Ø id指定一个名称,用于区分存储在计划表中的多个执行计划。支持30个字符以内的任何字符串。这个参数是可选的,默认值是NULL。
Ø table指定将关于执行计划的信息插入到的计划表的名称。这个参数是可选的,默认值是plan_table。一旦有需要,也可以使用通常的语法指定一个模式名以及数据库链接名:schema.table@dblink。
一定要认识到EXPLAIN
PLAN语句是一个DML语句,而非一个DDL语句。这意味着它不会为当前的事务执行一个隐式提交。它只是简单地将数据插入到计划表中。
要执行EXPLAIN
PLAN语句,需要将执行SQL语句的权限作为一个参数传递进去。注意当获取视图的执行计划时,同样需要所有底层表和视图的权限。因为这有点违反直觉,看一下下面的例子。注意
为何用户能够执行一个引用user_objects视图的查询却不能为相同的查询语句执行EXPLAIN PLAN语句:
select count(*) FROM user_objects;
SQL> EXPLAIN PLAN FOR select count(*)
FROM user_objects;
EXPLAIN PLAN FOR select count(*)FROM user
objects
*
ERROR
at line 1:
ORA-01039: insufficient privileges on
underlying objects of the view
就像错误信息中指出的,用户缺少一个或几个被user_objects视图引用的数据字典表的select权限。