oracle 获取执行计划 EXPLAIN PLAN语句

2023年 10月 31日 67.9k 0

 获取执行计划

基本上,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权限。

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论