查看执行计划

1.工具介绍

总结:单纯估算用autotrace,真实调优用DBMS_XPLAN带参数

1、explain

因为绑定变量的原因,这个只能是估算

explain plan for select 3+5 from dual;

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

select * from table(dbms_xplan.display(table_name=>‘PLAN_TABLE‘,statement_id=>null,format=>‘ALL‘));

用explain plan解释一个SQL,相关信息会默认被放到一个一个叫PLAN_TABLE的全局临时表中。可以用这个来查看。

参数:

table_name,默认‘PLAN_TABLE‘,如果别的一个表跟PLAN_TABLE有一样的表结构,也可以读取里面的信息。

statement_id 默认null,即查该session最后的一条explain plan解释的语句。

format   默认‘TYPICAL‘,全部是‘BASIC‘,‘TYPICAL‘,‘ALL‘,ALL的时候会显示PROJECTION, ALIAS and information about REMOTE SQL if the operation is distributed。其实除了指定这3个级别外,显示什么信息也可以再通过后面的备注(减号代表去除相关信息)

‘ALL -PROJECTION -NOTE‘  #ALL级别,但不要投射与NOTE信息

‘BASIC ROWS‘  --BASE下本来没有ROWS信息,我们也可以给它加上。

还有其他选项,如:outline

每个连上来的用户都可以使用plan_table,不用特别的权限,也不用读取诸如v$plan这样的视图。

不会实际执行SQL,也不会在shared pool上生成该SQL的cursor,是生成了一个cursor不过是带上explain plan for字眼的,而没有独立的该sql的cursor产生。

2、autotrace

真实/估算,忽略绑定变量,非执行. 可以看逻辑读等数量

SET AUTOTRACE

ON EXPLAIN                                                          只显示执行计划                                         估算,因为没执行

ON STATISTICS                                                     只显示执行的统计信息

AUTOTRACE ON                                                    包含2,3两项内容                                        真实,因为执行过

AUTOTRACE TRACEONLY                                        与ON相似,但不显示语句的执行结果              真实,因为执行过

3.SQL_TRACE

在12c中文档中提示:不再支持SQL_TRACE参数; 真实计划,需要用TKPROF工具解析,可以获得绑定变量值.

alter session set sql_trace=true;

alter session set sql_trace=false;

exec dbms_system.set_sql_trace_in_session(9,437,true)

exec dbms_system.set_sql_trace_in_session(9,437,false)

4.EVENT 10053 10046

真实计划,研究执行计划产生的原因

10046为增强版sql_trace

参考《10046事件》

参考《10046&10053的区别》

10053是检查优化器行为的,实在搞不懂为什么走那个计划可以看看,用得较少。

10046可以检查一些等待事件的内容,也可以获取绑定变量,一般用得也比较少。

4.DBMS_XPLAN

真实计划

4.1 dbms_xplan.display_cursor

  1. DBMS_XPLAN.DISPLAY_CURSOR(
  2. sql_id        IN  VARCHAR2  DEFAULT  NULL,
  3. child_number  IN  NUMBER    DEFAULT  NULL,
  4. format        IN  VARCHAR2  DEFAULT  ‘TYPICAL‘);

IOSTATS:会展示该SQL的累计IO统计信息,加了last就显示最后一个。

MEMSTATS:只有开启了PGA自动内存管理,即pga_aggregate_target不是0,我们才能使用这项,会展示使用了多少memory,多少bytes被交换到磁盘,一般来说用了hash-join,sort,group by等比较需要内存的操作才会收集。

ALLSTATS:是‘IOSTATS MEMSTATS‘的同义词。  IO+内存

LAST:默认地展示都是该游标的累积统计信息,加了LAST才会显示最后一个。

RUNSTATS_TOT  --为了向后兼容,相当于IOSTATS

RUNSTATS_LAST --为了向后兼容,相当于IOSTATS LAST

查看该游标最后一次的实际统计信息执行计划

select * from table(dbms_xplan.display_cursor(‘fb8szhn9h5r95‘,null,‘allstats last‘));

会将该游标的累积执行信息列出,例如游标执行过两次后,starts,A-Rows,buffers也是上面的两倍

select * from table(dbms_xplan.display_cursor(‘fb8szhn9h5r95‘,null,‘allstats‘));

最详细,汇集了普通模式的all与详细模式的allstats,而且将默认不显示的outline信息也显示出来。

select * from table(dbms_xplan.display_cursor(‘fb8szhn9h5r95‘,null,‘all allstats last outline‘));

------------------------------------------------------------------------------------------------------------------------------

| Id | Operation | Name | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time | A-Rows | A-Time | Buffers | Reads |

------------------------------------------------------------------------------------------------------------------------------

| 0 | SELECT STATEMENT | | 1 | | | 3 (100)| | 25 |00:00:00.01 | 3 | 2 |

|* 1 | COUNT STOPKEY | | 1 | | | | | 25 |00:00:00.01 | 3 | 2 |

| 2 | TABLE ACCESS FULL| T1 | 1 | 25 | 54400 | 3 (0)| 00:00:01 | 25 |00:00:00.01 | 3 | 2 |

------------------------------------------------------------------------------------------------------------------------------

gather_plan_statistics看更详细的输出--能达到10046的粒度了

alter session set statistics_level=all;

select /*+ gather_plan_statistics */ from t1 where rownum<10;

Starts为该sql执行的次数。

E-Rows为执行计划预计的行数。

A-Rows为实际返回的行数。A-Rows跟E-Rows做比较,就可以确定哪一步执行计划出了问题。

A-Time为每一步实际执行的时间(HH:MM:SS.FF),根据这一行可以知道该sql耗时在了哪个地方。

Buffers为每一步实际执行的逻辑读或一致性读。

Reads为物理读。

OMem、1Mem为执行所需的内存评估值,0Mem为最优执行模式所需内存的评估值,1Mem为one-pass模式所需内存的评估值。

0/1/M 为最优/one-pass/multipass执行的次数。

select t.*

from v$sql s,table(dbms_xplan.display_cursor(s.sql_id,s.child_number,‘ADVANCED ALLSTATS LAST‘)) t where s.sql_id = ‘&SQL_ID‘ ;

-----------------------------------------------------------------------------------------------------------

4.2 dbms_xplan.display_awr.   展示awr信息库(因为shared pool中age out)中的执行计划--但是没有谓词条件

SELECT * FROM table(DBMS_XPLAN.DISPLAY_AWR(‘3hxb21q9h4t40‘,1367077082,null,‘all‘));

select * from table(dbms_xplan.display_awr(‘&sqlid‘,null,null,‘ADVANCED +PEEKED_BINDS‘));

参考《xplan.display_awr.sql》

sql_id   --输入存储在AWR中的sql_id,你可以先查dba_hist_sql_plan,dba_hist_sqltext,看看某个语句属于什么sql_id。

plan_hash_value  --如果是null的话该sql_id所有的执行计划会输出。默认null

db_id  --如果忽略,默认就是当前的database

format  --参考display(),还是‘basic‘,‘typical‘,‘all‘这样,默认typical

权限:用户需要select on DBA_HIST_SQL_PLAN,DBA_HIST_SQLTEXT,V$DATABASE的权限。

查sql_id,根据sql文本查出sql_id ,可以从dba_hist_sqltext查。

来源:展示的执行计划的信息,来源于dba_hist_sql_plan。

详细:是否可以用allstats这样查看更详细的执行计划,这可能得取决于你当时的sql有没开启手机详细运行时统计信息。

-----------------------------------------------------------------------------------------------------------

4.3 display_sql_plan_baseline   展示存储在SPM中的SQL执行计划

查看SPM中baseline的执行计划:DBMS_XPLAN.DISPLAY_sql_plan_baseline

SELECT *  FROM table(DBMS_XPLAN.DISPLAY_sql_plan_baseline(‘SQL_a074c4f7bacd50da‘,‘SQL_PLAN_a0x64yyxcun6u06957ae0‘,‘ALL‘));

SELECT * FROM  table(DBMS_XPLAN.DISPLAY_sql_plan_baseline(sql_handle => ‘SQL_351fadd1a0ec16be‘ ));

SELECT *  FROM table(DBMS_XPLAN.DISPLAY_sql_plan_baseline(plan_name => ‘SQL_PLAN_a0x64yyxcun6u06957ae0‘,‘ALL‘));

格式:

sql_handle  SPM中的sql_handle相当于v$sql中的sql_id,默认Null

plan_name  SPM中唯一标识一个执行计划,就像v$sql中的plan_hash_value。默认null。如果是null,那么上面的sql_handle就必须指定。

format:参考display(),默认typical。

执行计划来源于:DBA_SQL_PLAN_BASELINES

5.各种现成脚本是利器

display_cursor_9i.sql.   —因为9i没有display_cursor方法

printsql


2.执行计划阅读顺序:

由上至下:在执行计划中一般含有多个节点,相同级别(或并列)的节点,靠上的优先执行,靠下的后执行

从右向左:在某个节点下还存在多个子节点,先从最靠右的子节点开始执行。

靠光标大法即可,或者有些脚本里面带了执行的步骤

标量子查询 可能违反最右最上原则,参考《Oracle SQL优化分析步骤》

执行计划如果显示是access,就表示这个谓词条件的值将会影响数据的访问路径(表还是索引),而filter表示谓词条件的值并不会影响数据访问路径,只起到过滤的作用

带*号的是filter过滤 或 驱动access

动态采样

如果在执行计划中有如下提示:

-dynamic sampling used for the statement

这提示用户CBO当前使用的技术,需要用户在分析计划时考虑到这些因素。 当出现这个提示,说明当前表使用了动态采样。 我们从而推断这个表可能没有做过分析

这里会出现两种情况:

(1)       如果表没有做过分析,那么CBO可以通过动态采样的方式来获取分析数据,也可以或者正确的执行计划。

(2)       如果表分析过,但是分析信息过旧,这时CBO就不会在使用动态采样,而是使用这些旧的分析数据,从而可能导致错误的执行计划。

在看执行计划的时候,除了看执行计划本身,还需要看谓词和提示信息。 通过整体信息来判断SQL 效率。

动态采样适用范围:

1.没有统计信息,比如生成的中间临时表

2.多列产生关联,比如人为指定(11g还引入多列统计信息,但是是生成了一个列,代价大)

时间: 2024-08-23 03:59:59

查看执行计划的相关文章

T-SQL备忘(5):查看执行计划

先理解几个概念:表扫描.聚集索引扫描.聚集索引查找.索引扫描.书签查找. [查看执行计划] 在理解概念之前先得知道如何查看执行计划—Ctrl+L.如下图: 注:SQL Server的执行计划是从右向左看的. [理解几个概念] 1.表扫描(Table scan):发生于堆表,并且没有可用的索引可用时,会发生表扫描,表示整个表扫描一次. select * from T_UserInfo 查看执行计划如下: 2.聚集索引扫描(Clustered Index Scan):发生于聚集表,也相当于全表扫描操

创建跟踪和查看执行计划需要的权限

多看书,多积累,温故知新.只有要用的时候,才会发现知识欠缺.不要说知道有这么回事,要很有底气的回答应该怎么做.查看跟踪和查看执行计划需要怎样的权限?sysadmin/db_owner肯定可以,但不应该给这么大的权限.创建登录名 --create login use master go create login TracePlan with password='123qwe' go 创建用户 --create user use AdventureWorks2008R2 go create user

如何查看执行计划

SSMS里的设置方法就不多说了上图看 如何以SQL命令的方式查看执行计划: 一.查看实际的执行计划 方式一,查看文本格式 SET STATISTICS PROFILE ON; SET STATISTICS PROFILE OFF; 方式二.查看XML格式(可点击转到图形界面查看,因为类似全屏,界面比较大,对于比较大的执行计划会有用些) SET STATISTICS XML ON; SET STATISTICS XML OFF; 二.查看估计的执行计划 方式一,查看全部 SET SHOWPLAN_

hive高阶1--sql和hive语句执行顺序、explain查看执行计划、group by生成MR

hive语句执行顺序 msyql语句执行顺序 代码写的顺序: select ... from... where.... group by... having... order by.. 或者 from ... select ... 代码的执行顺序: from... where...group by... having.... select ... order by... hive 语句执行顺序 大致顺序 from... where.... select...group by... having

简单对比查看执行计划的两种方法EXPLAIN PLAN 和 AUTOTRACE

EXPLAIN PLAN 和 AUTOTRACE 都可以查看执行计划. 值得一提的是:前者只是优化器通过读取数据字典的统计信息做出'最佳'访问路径判断,并没有真正去执行语句:后者是实际去执行了SQL语句,同时把访问记录数.执行计划.统计信息等打印出来. 下面粘出实验结果加以说明,注意对比两者的耗时: <p>SQL> CONNECT /AS SYSDBA Connected.</p><p>SQL> SET LINESIZE 300; SQL> SET T

Mongodb查看执行计划和强制索引策略

查看执行计划的方法:explain () winningPlan是最终的执行计划 其中的indexBounds索引计划 在age上建立索引 > db.person.ensureIndex({age:1}); {    "createdCollectionAutomatically" : false,    "numIndexesBefore" : 1,    "numIndexesAfter" : 2,    "ok"

如何查看执行计划以及执行计划的准确性

下面的执行计划是怎么打印出来的,很多朋友还是不知道.其实语句只有三条: explain plan for 你要查看的SQL语句; commit; select * from table(dbms_xplan.display); -----分割线---------------------------------- 先告诉大家一个原则,看执行计划的时候,从第一行开始向右下看,一直到最右边.如果有并列的,那么先上再下.如果没并列,右边的先执行. 闲话少说,先上图吧: 这是一个简单的SQL的执行计划,这

Oracle数据库查看执行计划

基于ORACLE的应用系统很多性能问题,是由应用系统SQL性能低劣引起的,所以,SQL的性能优化很重要,分析与优化SQL的性能我们一般通过查看该SQL的执行计划,本文就如何看懂执行计划,以及如何通过分析执行计划对SQL进行优化做相应说明. 一.什么是执行计划(explain plan) 执行计划:一条查询语句在ORACLE中的执行过程或访问路径的描述. 二.如何查看执行计划 1: 在PL/SQL下按F5查看执行计划.第三方工具toad等. 很多人以为PL/SQL的执行计划只能看到基数.优化器.耗

sqlserver授予用户查看执行计划的权限

sqlserver查看语句的执行计划是非常重要的,可以提高开发人员代码的质量.所以有必要授予开发人员对数据库查看执行计划的权限. 查看执行计划的权限属于数据库一级别的权限,具体例子如下 use test:--选择需要授权的数据库 grant showplan to user;--授权给对应的用户

oracle如何查看执行计划

1.在PL/SQL Developer中得到一个SQL的执行计划 输入想要查看执行计划的目标SQL,再按一下快捷键F5就可以了.2.explain plan 命令 explain plan for + 目标SQL select * from table(dbms_xplan.display)3. DBMS_XPLAN 包 1) select * from table(dbms_xplan.display_cursor(null,null,'advanced')) 它用于在SQLPLUS中查看刚刚