该文档为根据相关资料整理、总结而成,主要讲解Oracle数据库中,获取SQL语句执行计划的最权威、最正确的方法、步骤,此外,还详细说明了每种方法中可选项的意义及使用方法,以方便大家和自己日常工作中查阅使用,因本人未发现本博客支持附件上传功能,需要PDF文件格式的朋友可向我要,也可到群里下载,转载请注明出处。

1、查询v$sql_plan:

SQL> col "Query Plan_Table" format a100

SQL> select id,lpad(' ', 2*(level-1))||operation||''||options||' '||object_name||' '||decode(id, 0, 'Cost='||cost) "QueryPlan_Table"

fromv$sql_plan

startwith id = 0

andsql_id = '&&sql_id'

andplan_hash_value = &&plan_hash

connect byprior id = parent_id

andsql_id = '&&sql_id'

andplan_hash_value = &&plan_hash;

--注::SQL_ID可查v$sqltext和dba_hist_sqltext,也可通过其他途径获得。

2、通过包DBMS_XPLAN

1)DISPLAY

SQL>explain plan for select * from t_users whereuser_id='TEST';

SQL>select * from table(dbms_xplan.display());

SQL>select * fromtable(dbms_xplan.display(null,null,'BASIC ROWS BYTES'));

--注:

1.TABLE_NAME:存储查询计划的表名,默认值为PLAN_TABLE。

2.STATEMENT_ID :SQL 语句ID。可在执行ExplainPlan 命令时,通过SetStatement_

id 子句来指定。如为NULL,则取最近一条被解释的语句。

3.FORMAT:输出格式。在DISPLAY 函数中,有以下预定义格式选:

1)'BASIC' :基本格式。输出的内容最少,仅输出查询计划中每个操作的ID、名称和选项及操作对象名。

2)'TYPICAL':典型格式。除了基本格式中的内容外,还输出每个操作的记录行数、

字节数、代价和时间,以及相关的提示信息(如远程SQL、优化器建议等)。如

存在谓词,还输出每个操作中的过滤条件和访问条件。此外,如涉及分区表,还输出分区裁剪信息;如涉及并行查询,还输出并行操作信息(如表队列信息、并行查询分布方式等)。为默认格式。

3)'SERIAL':串行执行格式。这种格式和典型格式的输出内容基本一致,不同之处在于,对并行查询,它不会输出相关的并行内容。

4)'ALL':完全格式。输出的内容相对完整。除了典型格式的内容以外,还会输出字段投影信息和别名信息。

此外,用户还可通过在格式化字符串中添加或屏蔽一些关键词进行细化输出,

例如:“BASICROWS”,“TYPICAL-PREDICATE”等

1)ROWS:优化器估算出的记录行数;

2)BYTES:优化器估算出的字节数;

3)COST:优化器估算出的代价;

4)PARTITION:分区裁剪;

5)PARALLEL:并行查询;

6)PREDICATE:谓词;

7)PROJECTION:字段投射;

8)ALIAS:别名;

9)REMOTE:分布式查询信息;

10)NOTE:相关注释信息。

2)DISPLAY_CURSOR

SQL>select /*+gather_plan_statistics*/* fromt_users where user_id='TEST';

SQL>select * fromtable(dbms_xplan.display_cursor(null,null,'BASIC LAST ALLSTATS'));

--注:

1.DISPLAY_CURSOR 函数可以显示内存中一个或者多个游标的执行计划;

2.用户须对视图V$SQLV、$SQL_PLAN 和V$SQL_PLAN_STATISTICS_ALL 的SELECT有权限;

3.参数:

1)SQL_ID:如果没有指定SQL_ID(指定NULL),则默认会显示当前会话中最后一条执行的SQL 语句。

2)CURSOR_CHILD_NO:语句的子游标序号,如果不指定,则会显示该语句的所有子游标的执行计划。

3)FORMAT:格式化控制字符串。DISPLAY 函数的格式化控制字符串的所有选项都适用于DISPLAY_CURSOR 函数。如运行语句时通过GATHER_PLAN_STATISTICS或设置系统参数STATISTICS_LEVEL 为“ALL”收集语句运行的性能统计数据,则在细化选项中还有额外的选项,以选择是否输出这些数据。

4)IOSTATS:是否输出计划的输入输出(IO)统计数据;

5)MEMSTATS :在启用了PGA 自动管理的情况下,是否输出计划的输入内存统计数据(内存使用量、内存读次数等);

6)ALLSTATS:包含了IOSTATS和MEMSTATS 的全部内容;

7) LAST :以上三个选项输出的是该游标所有执行所产生的数据的总和。也可增加LAST选项以限定仅显示最后一次运行的统计数据。

此外,还有一些选项可用于该函数的输出控制:

8)'ADVANCED' :高级格式。高级格式除了会输出完全格式中的所有内容外,还会视情况输出绑定变量窥视信息和计划概要信息;

9) OUTLINE:是否以提示方式显示计划概要;

10)PEEKED_BINDS:是否显示绑定变量窥视信息;

11)BUFFSTATS:是否显示内存读次数(包括一致性读和当前读次数),该信息为IOSTATS 的一部分;

12)PLAN_HASH:是否显示计划的哈希值,该选项同样适用于DISPLAY函数。

3)DISPLAY_AWR

SQL>select sql_id, to_char(substr(sql_text,0,2000))

fromdba_hist_sqltext

whereupper(sql_text) like 'SELECT * FROM TEST%';

SQL>select * fromtable(dbms_xplan.display_awr('&sql_id'));

--注:

1.DISPLAY_AWR 函数显示存储在AWR历史数据的执行计划。

2.须对以下视图有SELECT权限:DBA_HIST_SQL_PLAN 和DBA_HIST_SQLTEXT。

3.参数:

1)SQL_ID :可以从DBA_HIST_SQL_PLAN.SQL_ID或DBA_HIST_SQLTEXT.SQL_ID 获得,该参数必须指定非空值,没有默认值;

2)PLAN_HASH_VALUE :如果该参数未指定或为NULL,则会显示语句的所有执行计划;

3)DB_ID:指定显示哪个数据库的执行计划,默认为本地数据库ID。页可将其他数据库的AWR导入本地库进行分析。

4)FORMAT:格式化控制字符串。与DISPLAY的相同选项类似。

4)DISPLAY_SQLSET

SQL>declare

2 ss_name varchar2(60);

3 begin

4 ss_name :=dbms_sqltune.create_sqlset();

5 dbms_sqltune.capture_cursor_cache_sqlset(ss_name,600,100);

6 dbms_output.put_line(ss_name);

7 end;

8 /

SQL>select sqlset_name,sql_id,sql_text fromDBA_SQLSET_STATEMENTS where upper(sql_text)

like 'SELECT * FROM TEST%';

SQL>select * fromtable(dbms_xplan.display_sqlset('STS_6','abcdefg',null,'BASIC ROWS COST'));

--注:

1.DISPLAY_SQLSET函数显示存储在一个SQL调优集中的语句的执行计划。

2.参数:

1)SQLSET_NAME:SQL 集的名称。每个SQL 集都有一个单独的名称(可在创建时

用户指定,也可系统自动生成),需指定从哪个SQL集中读取和显示语句的执行计划,该参数没有默认值,必须指定;

2)SQL_ID :可从USER/DBA/ALL_SQLSET_PLANS.SQL_ID获得,该参数必须指定非空值,没有默认值;

3)PLAN_HASH_VALUE:如果未指定或为NULL,则会显示语句的所有执行计划;

4)FORMAT:格式化控制字符串。与DISPLAY的FORMAT 选项相同;

5)SQLSET_OWNER:SQL集的所有者,默认为当前用户名。

5)DISPLAY_SQL_PLAN_BASELINE

SQL>select * fromtable(dbms_xplan.display_sql_plan_baseline(sql_handle =>

'SYS_SQL_66cc81707e560a32'));

--注:

1.DISPLAY_SQL_PLAN_BASELINE 函数显示存储在数据字典当中SQL 执行计划基线的计划。

2.参数:

1)SQL_HANDLE:执行计划基线所属SQL的句柄名称,由Oracle在创建或载入执行计划到基线当中时自动生成,可以通过视图dba_sql_plan_baselines查询,默认为NULL;

2)PLAN_NAME :执行计划基线中某个执行计划的名称,由Oracle 创建或载入执行计划到基线当中时自动生成,可以通过视图dba_sql_plan_baselines查询,默认为NULL;

3)FORMAT :格式化控制字符串。DISPLAY_SQLSET 函数的格式化选项与DISPLAY

的选项相同。

4)当SQL_HANDLE和PLAN_NAME 都为空时,显示所有基线数据中的全部执行计划。

3、AUTOTRACE

1)配置test用户使用autot

SQL>conn sys/sys as sysdba

SQL>@?/SQLPLUS/ADMIN/PLUSTRCE.SQL

SQL>grant plustrace totest;

2)使用方法

1.SET AUTOTRACE ON:打开AUTOTRACE,并输出所有内容,包括语句本身的查询结果、执行计划,以及性能统计数据。

2.SET AUTOTRACE ON EXPLAIN :打开AUTOTRACE,并输出语句本身的查询结果和执行计划,不输出性能统计数据。

3.SET AUTOTRACE ON STATISTICS :打开AUTOTRACE,并输出语句本身的查询结果和性能统计数据,不输出执行计划。

4.SET AUTOTRACE TRACE :打开AUTOTRACE,并输出执行计划和性能统计数据,不输出语句本身的查询结果。

5.SET AUTOTRACE TRACE EXPLAIN :打开AUTOTRACE,并输出执行计划,不输出语句本身的查询结果和性能统计数据。

6.SET AUTOTRACE TRACESTATISTICS:打开AUTOTRACE,并输出性能统计数据,不输出语句本身的查询结果和执行计划。

7.SET AUTOTRACE OFF:关闭AUTOTRACE。

4、其他方法

1)SQL_TRACE(或者10046 跟踪事件):该方法会在跟踪文件里显示执行计划及相关统计信息:

SQL>alter session set sql_trace=true;

SQL>select * from t_users where user_id=’TEST’;

SQL>alter session set sql_trace=false;

SQL>select distinct spid from v$process p,v$session s, v$mystat m where p.addr=s.paddr and s.sid=m.sid;

SQL>show parameter user_dump_dest

SQL>ed/home/oracle/admin/ora10g/udump/ora10g_ora_sid.trc

2)OPTIMIZER_TRACE(或者10053 跟踪事件):该方法会在跟踪文件里记录优化器分析选择执行计划的过程:

SQL>alter session set"_optimizer_trace"=ALL;

SQL>explain plan for select * from t_users whereusername=’TEST’;

SQL>alter session set"_optimizer_trace"=NONE;

SQL>select distinct spid from v$process p,v$session s, v$mystat m where p.addr=s.paddr and s.sid=m.sid;

SQL>ed/home/oracle/admin/ora10g/udump/ora10g_ora_sid.trc

Oracle中SQL调优(SQL TUNING)之最权威获取SQL执行计划大全的更多相关文章

  1. SQL调优

    # 问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用 系统提交实际应用后,随着数据库中数据的增加,系 ...

  2. SQL注入漏洞和SQL调优SQL注入漏洞和SQL调优

    SQL注入漏洞和SQL调优 最近读了程序员的SQL金典这本书,觉得里面的SQL注入漏洞和SQL调优总结得不错,下面简单讨论下SQL注入漏洞和SQL调优. 1. SQL注入漏洞 由于“'1'='1'”这 ...

  3. Oracle SQL 调优健康检查脚本

    Oracle SQL 调优健康检查脚本 我们关注数据库系统的性能,进行数据库调优的主要工作就是进行SQL的优化.良好的数据架构设计.配合应用系统中间件和写一手漂亮的SQL,是未来系统上线后不出现致命性 ...

  4. 11g新特性-自动sql调优(Automatic SQL Tuning)

    11g新特性-自动sql调优(Automatic SQL Tuning) 在Oracle 10g中,引进了自动sql调优特性.此外,ADDM也会监控捕获高负载的sql语句. 在Oracle 11g中, ...

  5. 《高性能SQL调优精要与案例解析》一书谈主流关系库SQL调优(SQL TUNING或SQL优化)核心机制之——索引(index)

    继<高性能SQL调优精要与案例解析>一书谈SQL调优(SQL TUNING或SQL优化),我们今天就谈谈各主流关系库中,占据SQL调优技术和工作半壁江山的.最重要的核心机制之一——索引(i ...

  6. 《高性能SQL调优精要与案例解析》一书谈SQL调优(SQL TUNING或SQL优化)学习

    <高性能SQL调优精要与案例解析>一书上市发售以来,很多热心读者就该书内容及一些具体问题提出了疑问,因读者众多外加本人日常工作的繁忙 ,在这里就SQL调优学习进行讨论并对热点问题统一作答. ...

  7. 初次使用SQL调优建议工具--SQL Tuning Advisor

    在10g中,Oracle推出了自己的SQL优化辅助工具: SQL优化器(SQL Tuning Advisor :STA),它是新的DBMS_SQLTUNE包. 使用STA一定要保证优化器是CBO模式下 ...

  8. Oracle SQL调优系列之SQL Monitor Report

    @ 目录 1.SQL Monitor简介 2.捕捉sql的前提 3.SQL Monitor 参数设置 4.SQL Monitor Report 4.1.SQL_ID获取 4.2.Text文本格式 4. ...

  9. Oracle SQL调优记录

    目录 一.前言 二.注意点 三.Oracle执行计划 四.调优记录 @ 一.前言 本博客只记录工作中的一次oracle sql调优记录,因为数据量过多导致的查询缓慢,一方面是因为业务太过繁杂,关联了太 ...

随机推荐

  1. docker对数据卷容器进行备份

    转载请注明出处 官网的数据以及各大博客都没有对这个的具体说明,本人也是理解了好久. 我们使用docker的过程中,使用共享的数据卷是经常的,那么.我们要怎么进行备份呢?   首先,我们得了解下面4个命 ...

  2. koa知识点

    1. Koa 不支持 直接调用底层 res 进行响应处理.请避免使用以下 node 属性: res.statusCode res.writeHead() res.write() res.end() 2 ...

  3. linux学习之——数据操作:添加与查询

    说明: 在linux系统中,利用搭建的服务器,编写两个页面,一个添加信息,一个展现信息: 主要涉及到:php+mysql的操作: 数据添加页面: <html> <head> & ...

  4. 【PHP基础】常用mySQL语句以及WampServer2.2设置数据库默认编码

    一.WampServer2.2设置数据库默认编码(此部分转自http://www.cnsecer.com/5984.html) wamp下MySQL的默认编码是Latin1,不支持中文,要支持中文的话 ...

  5. java 快速排序

    快速排序比插入排序快了两个数量级 package test.sort; public class Paixu { public static void main(String[] args) { // ...

  6. gulp + es6 + babel+ angular 搭建环境并实现简单的路由

    1.ECMAscript 6的语法糖面临的唯一问题就是浏览器兼容的问题,使得很多程序员望而怯步. 2.babel的作用就是将es6的语法编译成es5被浏览器所识别.这样就可以任性的使用es6了. 3. ...

  7. 深入学习css伪类和伪元素及其用法

    前言 CSS的伪类和伪元素在平时的代码中经常会出现,可是一旦别人问你,什么是伪类,什么是伪元素,可能还是不能完整的表述出来,下面我们来一探究竟. 伪类和伪元素定义 伪类用于在页面中的元素处于某个状态时 ...

  8. Python知识梳理

    这是个人学习笔记,非教程,内容会有些混乱 极简教程     数据类型 我们可以使用type()函数类获取对象的类型,Python3中内置数据类型包括:None,int,float,complex,st ...

  9. AOP 怎么理解?

    什么是 AOP ? AOP 为 Aspect Oriented Programming 的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP 是 OOP ...

  10. README.md文件编辑

    111 蜗牛图片管理系统 =============== ## 安装环境 >+ thinkphp版本: >+ php版本:.0以上 >+ 需要安装在服务器环境,免费使用 ### 特点 ...