ORACLE数据库查看执行计划的方法

合集下载

查看ORACLE执行计划的几种常用方法

查看ORACLE执行计划的几种常用方法

查看ORACLE执⾏计划的⼏种常⽤⽅法SQL的执⾏计划实际代表了⽬标SQL在Oracle数据库内部的具体执⾏步骤,作为调优,只有知道了优化器选择的执⾏计划是否为当前情形下最优的执⾏计划,才能够知道下⼀步往什么⽅向。

执⾏计划的定义:执⾏⽬标SQL的所有步骤的组合。

我们⾸先列出查看执⾏计划的⼀些常⽤⽅法:1. explain plan命令PL/SQL Developer中通过快捷键F5就可以查看⽬标SQL的执⾏计划了。

但其实按下F5后,实际后台调⽤的就是explain plan命令,相当于封装了该命令。

explain plan使⽤⽅法:(1) 执⾏explain plan for + SQL(2) 执⾏select * from table(dbms_xplan.display);实验表准备:SQL> desc test1;Name Null Type----------------------------------------- -------- ----------------------------T1ID NOT NULL NUMBER(38)T1V VARCHAR2(10)SQL> desc test2;Name Null Type----------------------------------------- -------- ----------------------------T2ID NOT NULL NUMBER(38)T2V VARCHAR2(10)实验:SQL> set linesize 100SQL> explain plan for select t1id, t1v, t2id, t2v from test1, test2 where test1.t1id = test2.t2id;Explained.第⼀步使⽤explain plan对⽬标SQL进⾏了explain,第⼆步使⽤select * from table(dbms_xplan.display)语句展⽰出该SQL的执⾏计划。

oracle 统计信息 执行计划

oracle 统计信息 执行计划

oracle 统计信息执行计划摘要:1.Oracle 统计信息的概念和作用2.Oracle 执行计划的概念和作用3.Oracle 统计信息和执行计划的关系4.如何查看和分析Oracle 执行计划5.如何利用Oracle 统计信息优化执行计划6.总结正文:Oracle 统计信息和执行计划是Oracle 数据库性能优化的关键概念。

统计信息为Oracle 优化器提供有关数据库对象的详细信息,有助于优化器制定高效的执行计划。

执行计划是Oracle 优化器根据统计信息和SQL 语句生成的执行SQL 语句的步骤。

了解这两个概念以及它们之间的关系对于优化数据库性能至关重要。

一、Oracle 统计信息的概念和作用Oracle 统计信息是关于数据库对象的详细数据,包括表、索引、约束等。

这些统计信息有助于Oracle 优化器在执行SQL 语句时选择最佳的执行计划。

统计信息可以显示表中的行数、列的数据分布、索引的使用情况等。

通过收集和维护这些统计信息,Oracle 优化器可以更好地了解数据库对象的结构和数据分布,从而生成更高效的执行计划。

二、Oracle 执行计划的概念和作用Oracle 执行计划是优化器根据统计信息和SQL 语句生成的执行SQL 语句的步骤。

执行计划包括访问路径、表连接、查询优化等。

优化器会根据统计信息和SQL 语句的特点选择最佳的执行计划,以提高查询效率。

执行计划可以在Oracle 数据库中使用EXPLAIN PLAN 命令查看。

三、Oracle 统计信息和执行计划的关系Oracle 统计信息和执行计划密切相关。

统计信息为优化器提供有关数据库对象的详细信息,有助于优化器制定高效的执行计划。

执行计划是优化器根据统计信息和SQL 语句生成的,它会使用统计信息来选择最佳的执行路径和查询优化策略。

因此,统计信息的质量和准确性对执行计划的优化至关重要。

四、如何查看和分析Oracle 执行计划要查看和分析Oracle 执行计划,可以使用以下方法:1.使用EXPLAIN PLAN 命令。

查看执行计划的几种方法

查看执行计划的几种方法

查看Oracle执行计划的几种方法一、通过PL/SQL Dev工具1、直接File->New->Explain Plan Window,在窗口中执行sql可以查看计划结果。

其中,Cost表示cpu的消耗,单位为n%,Cardinality表示执行的行数,等价Rows。

2、先执行 EXPLAIN PLAN FOR select * from tableA where paraA=1,再 select * from table(DBMS_XPLAN.DISPLAY)便可以看到oracle的执行计划了,看到的结果和1中的一样,所以使用工具的时候推荐使用1方法。

注意:PL/SQL Dev工具的Command window中不支持set autotrance on的命令。

还有使用工具方法查看计划看到的信息不全,有些时候我们需要sqlplus的支持。

二、通过sqlplus1.最简单的办法Sql> set autotrace onSql> select * from dual;执行完语句后,会显示explain plan 与统计信息。

这个语句的优点就是它的缺点,这样在用该方法查看执行时间较长的sql语句时,需要等待该语句执行成功后,才返回执行计划,使优化的周期大大增长。

如果不想执行语句而只是想得到执行计划可以采用:Sql> set autotracetraceonly这样,就只会列出执行计划,而不会真正的执行语句,大大减少了优化时间。

虽然也列出了统计信息,但是因为没有执行语句,所以该统计信息没有用处,如果执行该语句时遇到错误,解决方法为:(1)在要分析的用户下:Sqlplus>@ ?dbmsadminutlxplan.sql(2) 用sys用户登陆Sqlplus>@ ?sqlplusadminplustrce.sqlSqlplus> grant plustrace to user_name;- - user_name是上面所说的分析用户2.用explain plan命令(1) sqlplus> explain plan for select * from testdb.myuser(2) sqlplus> select * from table(dbms_xplan.display);上面这2种方法只能为在本会话中正在运行的语句产生执行计划,即我们需要已经知道了哪条语句运行的效率很差,我们是有目的只对这条SQL语句去优化。

oracle执行计划怎么看

oracle执行计划怎么看

oracle执行计划怎么看【Oracle执行计划详解】Oracle执行计划是数据库查询优化的关键工具之一,它提供了查询语句的执行路径和各种操作的详细信息,可以帮助我们分析查询语句的性能问题和优化的可能方向。

本文将详细介绍如何查看Oracle执行计划,以及如何理解执行计划中的各种信息。

一、查看执行计划的方法在Oracle数据库中,我们可以通过以下几种方式来查看执行计划:1. 使用EXPLAIN PLAN语句EXPLAIN PLAN是Oracle内置的一个SQL语句,它能够分析给定的SQL语句,并将执行计划保存在数据库中。

具体用法如下:```EXPLAIN PLAN FOR your_sql_statement;```执行以上语句后,可以通过以下语句查看执行计划:```SELECT * FROM PLAN_TABLE;```2. 使用AUTOTRACE功能AUTOTRACE是Oracle提供的一个工具,它可以在执行SQL语句时同时输出执行计划和统计信息。

使用AUTOTRACE非常方便,只需执行以下语句:```SET AUTOTRACE ON;```然后执行目标SQL语句即可。

3. 使用SQL Developer如果你使用Oracle SQL Developer这样的工具,它会自动在查询结果面板中显示执行计划。

只需将光标悬停在查询语句上,即可查看详细的执行计划信息。

二、执行计划的解读无论通过哪种方式,查看的执行计划都是一张树状结构的表,它包含了查询语句中各个操作的执行顺序和执行方式。

以下是一些常见的执行计划信息解读:1. OPERATION该列显示了执行计划中的每个操作的名称,例如TABLE ACCESS FULL表示全表扫描,INDEX UNIQUE SCAN表示唯一索引扫描等。

2. OPTIONS该列显示了执行计划中的每个操作的附加选项,例如INDEX RANGE SCAN中的RANGE SCAN表示使用范围扫描。

Oracle六种方法查看执行计划

Oracle六种方法查看执行计划

Oracle六种⽅法查看执⾏计划⽬录:(⼀)六种执⾏计划(1)explain plan for(2)set autotrace on(3)statistics_level=all(4)dbms_xplan.display_cursor获取(5)事件10046 trace跟踪(6)awrsqrpt.sqlOracle提供了6种执⾏计划获取⽅法,各种⽅法侧重点不同。

第⼀种:explain for步骤⼀:explain for 查询sql语句步骤⼆:select * from table(dbms_xplan.display());/*优点:⽆需真正执⾏,快捷⽅便;缺点:1.没有输出相关统计信息,例如产⽣了多少逻辑读,多少次物理读,多少次递归调⽤的情况;2.⽆法判断处理了多少⾏;3.⽆法判断表执⾏了多少次*/第⼆种:set autotrace on步骤⼀:sql> set autotrace on traceonly;步骤⼆:sql>执⾏查询Sql语句步骤三:sql> set autotrace off;/*优点:1.可以输出运⾏时的相关统计信息(产⽣多少逻辑读、多少次递归调⽤、多少次物理读等);2.虽然要等语句执⾏完才能输出执⾏计划,但是可以有traceonly开关来控制返回结果不打屏输出;缺点:1.必须要等SQL语句执⾏完,才出结果;2.⽆法看到表被访问了多少次;*/第三种:(3)statistics_level=all步骤⼀:ALTER SESSION SET STATISTICS_LEVEL=ALL;步骤⼆:执⾏待分析的SQL步骤三:select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));/*关键字解读:1.starts:SQL执⾏的次数;2.E-Rows:执⾏计划预计返回的⾏数;3.R-Rows:执⾏计划实际返回的⾏数;4.A-Time:每⼀步执⾏的时间(HH:MM:SS.FF),根据这⼀⾏可知SQL耗时在哪些地⽅;5.Buffers:每⼀步实际执⾏的逻辑读或⼀致性读;6.Reads:物理读;7.OMem:OMem为最优执⾏模式所需的内存评估值,这个数据是由优化器统计数据以及前⼀次执⾏的性能数据估算得出的;8.1Mem:1Mem为one-pass模式所需的内存评估值,当⼯作区⼤⼩⽆法满⾜操作所需的⼤⼩时,需要将部分数据写⼊临时磁盘空间中(如果仅需要写⼊⼀次就可以完成操作,就称⼀次通过,One-Pass;否则为多次通过,Multi-Pass).该列数据为语句最后⼀次执⾏中,单次写磁盘所需要的内存⼤⼩,这个由优化器统计数据以及前⼀次执⾏的性能数据估算得出的ed_Mem:Used-Mem则为当前操作实际执⾏时消耗的内存,括号⾥⾯为(发⽣磁盘交换的次数,1次即为One-Pass,⼤于1次则为Multi_Pass,如果没有使⽤磁盘,则显⽰0)*//*优点:1.可以清晰的从starts得出表被访问多少次;2.可以从E-Rows和A-Rows得到预测的⾏数和真实的⾏数,从⽽可以准确判断Oracle评估是否准确;3.虽然没有准确的输出运⾏时的相关统计信息,但是执⾏计划中的Buffers就是真实的逻辑读的数值;缺点:1.必须要等执⾏完后才能输出结果;2.⽆法控制结果打屏输出,不像autotrace可以设置traceonly保证不输出结果;3.看不出递归调⽤,看不出物理读的数值*/第四种:dbms_xplan.display_cursor获取步骤1:select * from table( dbms_xplan.display_cursor('&sql_id') ); --该⽅法是从共享池得到,如果SQL已被age out出share pool,则查找不到注释:1.还有1种⽅法,select * from table( dbms_xplan.display_awr('&sql_id') ); --该⽅法是从awr性能视图⾥⾯获取2.如果有多个执⾏计划,可⽤以下⽅法查出:select * from table(dbms_xplan.display_cursor('&sql_id',0));select * from table(dbms_xplan.display_cursor('&s ql_id',1));/*优点:1.知道sql_id即可得到执⾏计划,与explain plan for⼀样⽆需执⾏;2.可得到真实的执⾏计划缺点:1.没有输出运⾏的统计相关信息;2.⽆法判断处理了多少⾏;3.⽆法判断表被访问了多少次;*/第五种:事件10046 trace跟踪/*步骤1:alter session set events '10046 trace name context forever,level 12'; --开启追踪步骤2:执⾏sql语句;步骤3:alter session set events '10046 trace name context off'; --关闭追踪步骤4:select tracefile from v$process where addr=(select paddr from v$session where sid=(select sid from v$mystat where rownum<=1)); --找到跟踪后产⽣的⽂件步骤5:tkprof trc⽂件⽣成⽬标⽂件 sys=no sort=prsela,exeela,fchela --格式化命令*/第六种:awrsqrpt.sql/*步骤1:@?/rdbms/admin/awrsqrpt.sql步骤2:选择你要的断点(begin snap和end snap)步骤3:输⼊要查看的sql_id*/例⼦:见:(⼆)如何选择选择时⼀般遵循以下规则:1.如果sql执⾏很长时间才出结果或返回不了结果,⽤⽅法1:explain plan for2.跟踪某条sql最简单的⽅法是⽅法1:explain plan for,其次是⽅法2:set autotrace on3.如果相关查询某个sql多个执⾏计划的情况,只能⽤⽅法4:dbms_xplan.display_cursor或⽅法6:awrsqrpt.sql4.如果sql中含有函数,函数中有含有sql,即存在多层调⽤,想准确分析只能⽤⽅法5:10046追踪5.想法看到真实的执⾏计划,不能⽤⽅法1:explain plan for和⽅法2:set autotrace on6.想要获取表被访问的次数,只能⽤⽅法3:statistics_level = all。

oracleexplain数据库的用法

oracleexplain数据库的用法

oracleexplain数据库的用法一、简介Oracle Explain是Oracle数据库中用于分析查询性能的工具,它可以帮助开发人员和数据库管理员了解查询执行计划,优化查询性能,提高数据库的效率。

二、Explain的使用方法1. 查询性能分析:使用Explain可以分析查询性能,确定查询的执行计划是否合理,是否存在性能瓶颈。

通过Explain生成的报告可以提供查询执行过程中的热点数据和执行时间等信息。

2. 查询优化:通过Explain生成的报告,可以了解查询的执行计划,从而优化查询语句,提高查询性能。

例如,可以通过调整索引、优化数据表结构、减少数据访问等手段来优化查询性能。

3. 使用方式:在Oracle数据库中,可以使用Explain来分析查询性能。

在执行查询之前,可以使用EXPLAIN PLAN语句来生成查询的执行计划。

例如:```sqlEXPLAIN PLAN FOR SELECT * FROM table_name WHERE column_name ='value';```执行上述语句后,系统会生成一个执行计划,并将其存储在数据库中。

可以使用以下语句来查看执行计划:```sqlSELECT * FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE','PLAN_TABLE_OUTPUT'));```4. 注意事项:在使用Explain分析查询性能时,需要注意以下几点:* Explain只能分析已经执行的查询,无法分析未执行的查询。

* Explain生成的报告是基于当前数据库配置和数据表结构的,可能会随着数据库环境的改变而发生变化。

* Explain生成的报告只能提供一种参考,不能完全依赖它来优化查询性能。

需要结合实际情况进行优化。

三、Explain报告的内容Explain报告提供了关于查询执行计划的信息,包括但不限于以下内容:1. 查询计划:报告中会列出查询的执行计划,包括每个操作的顺序、操作类型、消耗的资源等信息。

oracle执行计划怎么看

oracle执行计划怎么看

oracle执行计划怎么看Oracle执行计划怎么看。

在Oracle数据库中,执行计划是指数据库系统在执行SQL语句时所采用的查询方式和顺序。

通过查看执行计划,我们可以了解数据库是如何执行我们的SQL 语句的,从而对SQL语句的性能进行优化。

在本文中,我们将介绍如何查看Oracle数据库的执行计划,以及如何解读执行计划中的信息。

1. 使用EXPLAIN PLAN语句。

要查看一个SQL语句的执行计划,可以使用Oracle提供的EXPLAIN PLAN语句。

这个语句可以告诉数据库系统在执行SQL语句时将采用的查询方式和顺序。

例如,我们可以这样使用EXPLAIN PLAN语句:```sql。

EXPLAIN PLAN FOR。

SELECT FROM employees WHERE department_id = 10;```。

在这个例子中,我们让数据库解释执行计划,然后可以通过查询相关的数据字典表来获取执行计划的信息。

2. 查询执行计划信息。

在使用EXPLAIN PLAN语句之后,我们可以通过以下查询来获取执行计划的信息:```sql。

SELECT FROM TABLE(DBMS_XPLAN.DISPLAY);```。

这个查询会返回执行计划的详细信息,包括每个步骤的操作类型、访问方法、访问对象等。

通过这些信息,我们可以了解数据库系统在执行SQL语句时所采用的具体方式,从而进行性能优化。

3. 解读执行计划。

执行计划中包含了很多信息,对于初学者来说可能有些晦涩。

但是,一旦掌握了一些基本的解读方法,就可以比较容易地理解执行计划了。

下面是一些常见的执行计划信息及其含义:ID,每个执行计划步骤的唯一标识符,可以用来区分不同的步骤。

Operation,操作类型,表示执行计划的具体操作,比如全表扫描、索引扫描、连接等。

Name,操作的具体对象,比如表名、索引名等。

Rows,估计的返回行数,表示数据库系统在执行该步骤时估计会返回多少行。

oracle执行计划怎么看

oracle执行计划怎么看

oracle执行计划怎么看Oracle执行计划怎么看。

Oracle数据库系统是当今世界上应用最广泛的关系型数据库管理系统之一,它的执行计划对于数据库性能的优化和调优起着至关重要的作用。

执行计划是Oracle数据库在执行SQL语句时生成的一种执行策略,它告诉我们数据库是如何执行SQL语句的,通过分析执行计划,我们可以了解SQL语句的执行效率,找到优化的空间,提高数据库的性能。

本文将介绍如何查看Oracle执行计划,以及如何解读执行计划,帮助大家更好地理解和优化SQL语句的执行效率。

一、查看执行计划的方法。

1. 使用EXPLAIN PLAN语句。

在Oracle中,我们可以使用EXPLAIN PLAN语句来获取SQL语句的执行计划。

具体的语法如下:EXPLAIN PLAN FOR。

SQL语句;然后可以使用如下语句来查看执行计划:SELECT FROM TABLE(DBMS_XPLAN.DISPLAY);2. 使用AUTOTRACE。

在SQLPlus或者SQL Developer中,我们可以使用AUTOTRACE功能来查看SQL语句的执行计划。

在SQLPlus中,可以使用如下语句开启AUTOTRACE功能:SET AUTOTRACE ON;然后执行需要查看执行计划的SQL语句即可。

3. 使用SQL Developer。

对于Oracle数据库开发人员来说,SQL Developer是一个非常常用的工具,它提供了直观的图形界面来查看SQL语句的执行计划。

在SQL Developer中,执行SQL语句后,可以通过右键菜单选择“Explain Plan”来查看执行计划。

二、执行计划的解读。

1. 表的访问方式。

在执行计划中,我们可以看到表的访问方式,包括全表扫描、索引扫描、唯一索引扫描等。

全表扫描意味着数据库将会扫描整张表,而索引扫描则表示数据库将会利用索引来快速定位数据,不同的访问方式对于SQL语句的性能影响很大。

Oracle查看执行计划的几种方法

Oracle查看执行计划的几种方法

Oracle查看执行计划的几种方法[object Object]在Oracle数据库中,有多种方法可以查看SQL查询语句的执行计划。

执行计划是指Oracle数据库在执行SQL查询语句时所采取的操作步骤和执行顺序。

以下是几种常用的查看执行计划的方法:1. 使用EXPLAIN PLAN语句:EXPLAIN PLAN是Oracle数据库提供的一个工具,可以用来查看SQL查询语句的执行计划。

使用EXPLAIN PLAN语句需要先执行SET AUTOTRACE ON语句,然后执行要查看执行计划的SQL查询语句。

执行计划将以文本的形式输出到屏幕上。

2. 使用AUTOTRACE功能:AUTOTRACE是Oracle数据库提供的一个功能,可以在执行SQL查询语句时自动显示执行计划和统计信息。

可以使用以下命令启用AUTOTRACE功能:````SETAUTOTRACEON;```然后执行要查看执行计划的SQL查询语句。

执行计划将以文本的形式输出到屏幕上。

3. 使用DBMS_XPLAN包:DBMS_XPLAN是Oracle数据库提供的一个包,可以用来查看SQL查询语句的执行计划。

使用DBMS_XPLAN包需要先执行SET AUTOTRACE OFF语句,然后执行要查看执行计划的SQL查询语句。

执行计划将以表格的形式输出到屏幕上。

````SETAUTOTRACEOFF;```````SELECT*FROMTABLE(DBMS_XPLAN.DISPLAY);```4. 使用V$SQL_PLAN视图:V$SQL_PLAN是Oracle数据库中的一个视图,可以用来查看SQL查询语句的执行计划。

可以使用以下命令查询V$SQL_PLAN视图:````SELECT * FROM V$SQL_PLAN WHERE SQL_ID = 'your_sql_id';```其中,'your_sql_id'是要查看执行计划的SQL查询语句的SQL ID。

查看ORACLE的实际执行计划

查看ORACLE的实际执行计划

查看ORACLE的实际执⾏计划ORACLE的执⾏计划分为预估执⾏计划和实际执⾏计划。

其中,你⽤Toad、PL/SQL Developer、SQL Developer、EXPLAIN PLAN FOR 或者SET ATUOTRACE TRACEONLY等获取的执⾏计划都是预估的执⾏计划。

有时候预估执⾏计划和实际执⾏计划有很⼤的差别,所以有时候,调优的时候需要对⽐实际执⾏计划和预估的执⾏计划,不能被预估的执⾏计划给欺骗了。

那么我们怎么查看实际的执⾏计划呢?⽅法1:查询v$sql_plan视图中的实际执⾏计划1:在窗⼝执⾏下⾯SQL语句SELECT ENAME, SAL FROM SCOTT.EMP, SCOTT.DEPTWHERE EMP.DEPTNO =DEPT.DEPTNOAND DEPT.LOC='CHICAGO';2:查看执⾏SQL的SQL_IDSELECT'%SELECT ENAME, SAL FROM SCOTT.EMP, SCOTT.DEPT%' 3: 查看v$sql_plan视图SELECT * FROM v$sql_plan WHERE SQL_ID='7m5qbhn98j1xw';通过v$sql_plan视图查看实际执⾏计划,其实是不太现实的,因为阅读困难,可读性差,尤其是复杂SQL语句。

⽅法2:SET AUTOTRACE ON查看实际执⾏计划其实这种⽅式有很⼤的限制,例如SQL输出⼤量的记录,那么在SQL Plus⾥⾯就会刷屏,⽽且等待的时间较长;另外DML操作不能⽤这种⽅法。

所以其实也并不实⽤,只是作为⼀种⽅法罗列于此。

⽅法3:DBMS_XPLAN.DISPLAY_CURSOR查看实际执⾏计划DBMS_XPLAN这个包最初是在ORACLE 9i R2中引⼊的,⽤来查看Explain Plan⽣成的执⾏计划。

DBMS_XPLAN 在ORACLE 10g 以及ORACLE 11g中,功能都有所增长。

plsql查看执行计划

plsql查看执行计划

plsql查看执行计划PL/SQL是Oracle数据库中的一种编程语言,可以用于编写存储过程、触发器、函数等数据库对象。

在进行PL/SQL编程时,我们经常需要查看执行计划来优化SQL语句的性能,以提高数据库的查询效率。

本文将介绍如何在PL/SQL中查看执行计划,帮助开发人员更好地优化数据库性能。

在PL/SQL中,我们可以使用DBMS_XPLAN包来查看SQL语句的执行计划。

DBMS_XPLAN包提供了多个过程,可以用于不同的场景下查看执行计划。

下面我们将介绍几种常用的方式来查看执行计划。

第一种方式是使用DBMS_XPLAN.DISPLAY_CURSOR过程来查看当前会话中最近执行的SQL语句的执行计划。

该过程需要指定SQL_ID 参数,可以通过v$session动态视图来获取当前会话的SQL_ID。

例如:```sql。

SELECT sql_id 。

FROM v$session 。

WHERE sid = sys_context('USERENV', 'SID');```。

得到SQL_ID后,我们可以使用DBMS_XPLAN.DISPLAY_CURSOR过程来查看执行计划:```sql。

SET LINESIZE 130。

SET PAGESIZE 0。

SET LONG 1000000。

EXEC DBMS_XPLAN.DISPLAY_CURSOR('SQL_ID');```。

上面的代码中,我们使用了SET命令来设置SQLPlus的显示格式,然后执行DBMS_XPLAN.DISPLAY_CURSOR过程来查看执行计划。

在执行结果中,我们可以看到SQL语句的执行计划、统计信息等。

第二种方式是使用DBMS_XPLAN.DISPLAY过程来查看指定SQL语句的执行计划。

该过程需要指定SQL_ID或者SQL语句文本作为参数。

例如:```sql。

EXEC DBMS_XPLAN.DISPLAY('PLAN_TABLE', 'SQL_ID','SQL_ID');```。

Oracle查看SQL执行计划的方式

Oracle查看SQL执行计划的方式

Oracle查看SQL执⾏计划的⽅式Oracle查看SQL执⾏计划的⽅式获取Oracle sql执⾏计划并查看执⾏计划,是掌握和判断数据库性能的基本技巧。

下⾯案例介绍了多种查看sql执⾏计划的⽅式:基本有以下⼏种⽅式:1、通过sql_trace初始化参数2、通过Autotrace3、通过explain plan4、通过dbms_xplan.display_cursor5、通过dbms_xplan.display_awr6、通过10046事件1、通过explain plan ⼯具12:24:00 SCOTT@ prod>explain plan for12:24:06 2 select empno,ename,sal,deptno from emp where empno=7788;Explained.Elapsed: 00:00:00.2212:24:16 SCOTT@ prod>select * from table(dbms_xplan.display);PLAN_TABLE_OUTPUT------------------------------------------------------------------------------------------------------Plan hash value: 2949544139--------------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |--------------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 1 | 46 | 2 (0)| 00:00:01 || 1 | TABLE ACCESS BY INDEX ROWID| EMP | 1 | 46 | 2 (0)| 00:00:01 ||* 2 | INDEX UNIQUE SCAN | PK_EMP | 1 | | 1 (0)| 00:00:01 |--------------------------------------------------------------------------------------Predicate Information (identified by operation id):---------------------------------------------------2 - access("EMPNO"=7788)14 rows selected.Elapsed: 00:00:01.142、通过DBMS_XPLAN.display_cursor查看12:52:37 SCOTT@ prod>desc dbms_xplanFUNCTION DISPLAY_CURSOR RETURNS DBMS_XPLAN_TYPE_TABLEArgument Name Type In/Out Default?------------------------------ ----------------------- ------ --------SQL_ID VARCHAR2 IN DEFAULTCURSOR_CHILD_NO NUMBER(38) IN DEFAULTFORMAT VARCHAR2 IN DEFAULT如果以scott⽤户访问需要进⾏授权:12:31:44 SYS@ prod>select * from dict where upper(table_name)='V$SESSION';TABLE_NAME COMMENTS------------------------------ ----------------------------------------V$SESSION Synonym for V_$SESSIONElapsed: 00:00:00.0912:31:09 SYS@ prod>grant select on V_$SESSION to scott;Grant succeeded.Elapsed: 00:00:00.1012:43:15 SCOTT@ prod>select * from table(dbms_xplan.display_cursor(null,null,'advanced')); PLAN_TABLE_OUTPUT------------------------------------------------------------------------------------------------------User has no SELECT privilege on V$SQL_PLAN解决权限不⾜:12:42:33 SYS@ prod>grant select any table to scott;Grant succeeded.12:43:46 SYS@ prod>show parameter o7NAME TYPE VALUE------------------------------------ ----------- ------------------------------O7_DICTIONARY_ACCESSIBILITY boolean TRUE12:44:54 SYS@ prod>案例:dbms_xplan.display_cursor12:42:45 SCOTT@ prod>select empno,ename,sal,deptno from emp where empno=7788;EMPNO ENAME SAL DEPTNO---------- ---------- ---------- ----------7788 SCOTT 3000 20Elapsed: 00:00:00.0812:43:15 SCOTT@ prod>select * from table(dbms_xplan.display_cursor(null,null,'all'));PLAN_TABLE_OUTPUT------------------------------------------------------------------------------------------------------SQL_ID bqz9ujgnn4jzu, child number 0-------------------------------------select empno,ename,sal,deptno from emp where empno=7788Plan hash value: 2949544139--------------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |--------------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | | | 2 (100)| || 1 | TABLE ACCESS BY INDEX ROWID| EMP | 1 | 46 | 2 (0)| 00:00:01 ||* 2 | INDEX UNIQUE SCAN | PK_EMP | 1 | | 1 (0)| 00:00:01 |--------------------------------------------------------------------------------------Query Block Name / Object Alias (identified by operation id):-------------------------------------------------------------PLAN_TABLE_OUTPUT------------------------------------------------------------------------------------------------------1 - SEL$1 / EMP@SEL$12 - SEL$1 / EMP@SEL$1Predicate Information (identified by operation id):---------------------------------------------------2 - access("EMPNO"=7788)Column Projection Information (identified by operation id):-----------------------------------------------------------1 - "EMPNO"[NUMBER,22], "ENAME"[VARCHAR2,10], "SAL"[NUMBER,22],"DEPTNO"[NUMBER,22]2 - "EMP".ROWID[ROWID,10], "EMPNO"[NUMBER,22]32 rows selected.Elapsed: 00:00:00.05案例:12:49:10 SCOTT@ prod>select empno,ename,sal,deptno from emp where empno=7788;EMPNO ENAME SAL DEPTNO---------- ---------- ---------- ----------7788 SCOTT 3000 20Elapsed: 00:00:00.0012:50:06 SCOTT@ prod>select * from table(dbms_xplan.display_cursor(null,null,'advanced')); PLAN_TABLE_OUTPUT------------------------------------------------------------------------------------------------------SQL_ID bqz9ujgnn4jzu, child number 0-------------------------------------select empno,ename,sal,deptno from emp where empno=7788Plan hash value: 2949544139--------------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |--------------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | | | 2 (100)| || 1 | TABLE ACCESS BY INDEX ROWID| EMP | 1 | 46 | 2 (0)| 00:00:01 | |* 2 | INDEX UNIQUE SCAN | PK_EMP | 1 | | 1 (0)| 00:00:01 |--------------------------------------------------------------------------------------Query Block Name / Object Alias (identified by operation id):-------------------------------------------------------------PLAN_TABLE_OUTPUT------------------------------------------------------------------------------------------------------1 - SEL$1 / EMP@SEL$12 - SEL$1 / EMP@SEL$1Outline Data-------------/*+BEGIN_OUTLINE_DATAIGNORE_OPTIM_EMBEDDED_HINTSOPTIMIZER_FEATURES_ENABLE('11.2.0.1')DB_VERSION('11.2.0.1')ALL_ROWSOUTLINE_LEAF(@"SEL$1")INDEX_RS_ASC(@"SEL$1" "EMP"@"SEL$1" ("EMP"."EMPNO"))END_OUTLINE_DATA*/PLAN_TABLE_OUTPUT------------------------------------------------------------------------------------------------------Predicate Information (identified by operation id):---------------------------------------------------2 - access("EMPNO"=7788)Column Projection Information (identified by operation id):-----------------------------------------------------------1 - "EMPNO"[NUMBER,22], "ENAME"[VARCHAR2,10], "SAL"[NUMBER,22],"DEPTNO"[NUMBER,22]2 - "EMP".ROWID[ROWID,10], "EMPNO"[NUMBER,22]46 rows selected.Elapsed: 00:00:00.0612:50:21 SCOTT@ prod>这种⽅法在 SQLPLUS中查看刚执⾏过的 SQLSQLSQL的执⾏计划。

oracle执行计划 语句

oracle执行计划 语句

oracle执行计划语句执行计划是Oracle数据库引擎在执行SQL语句时生成的指导执行计划。

它包含了Oracle数据库将执行SQL语句的详细步骤,包括表的访问方法、索引的使用、连接方式等,可以帮助优化SQL语句的性能。

要获取SQL语句的执行计划,可以使用Oracle数据库提供的以下几种方式:1. 使用EXPLAIN PLAN语句:执行以下语句可以获取SQL语句的执行计划,并将其保存到PLAN_TABLE表中。

```sqlEXPLAIN PLAN FOR <your_sql_statement>;```如果你只需要查看执行计划,可以使用以下语句:```sqlSELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);```2. 使用AUTOTRACE功能:在SQL*Plus或SQL Developer等工具中执行SQL语句时,可以使用AUTOTRACE功能来获取执行计划,它会显示在执行结果的后面。

```sqlSET AUTOTRACE ON;<your_sql_statement>;```3. 使用SQL Developer工具:在SQL Developer工具中,可以直接在SQL编辑器中执行SQL语句,并在执行计划选项卡中查看执行计划。

4. 使用SQL Trace:通过启用SQL Trace功能,可以在数据库跟踪文件中获取SQL语句的执行计划。

可以使用以下语句启用SQL Trace:```sqlALTER SESSION SET SQL_TRACE=TRUE;```然后,在跟踪文件中使用工具(如TKPROF)解析跟踪文件,并查看执行计划。

以上是几种常用的获取Oracle执行计划的方法,可以根据实际需求选择适合的方式来获取执行计划并进行SQL性能优化。

ORACLE查看执行计划及SQL TRACE

ORACLE查看执行计划及SQL TRACE

ORACLE中查看执行计划及SQL TRACE有三种方法:1.Explain planSQL>explain plan for select * from aa;查看结果:SQL>select * from table(dbms_xplan.display());2.AutotraceSQL>set timing on --记录所用时间SQL>set autotrace traceonly --自动记录执行计划然后执行SQL语句即可。

3.SQL_TRACEORACLE SQL_TRACE“SQL TRACE”是Oracle提供的用于进行SQL跟踪的手段,是强有力的辅助诊断工具。

在日常的数据库问题诊断和解决中,“SQL TRACE”是非常常用的方法。

一般,一次跟踪可以分为以下几步:1、界定需要跟踪的目标范围,并使用适当的命令启用所需跟踪。

2、经过一段时间后,停止跟踪。

此时应该产生了一个跟踪结果文件。

3、找到跟踪文件,并对其进行格式化,然后阅读或分析。

本文就“SQL TRACE”的这些使用作简单探讨,并通过具体案例对SQL_TRACE的使用进行说明。

一、“SQL TRACE”的启用。

(A)SQL_TRACE说明SQL_TRACE可以作为初始化参数在全局启用,也可以通过命令行方式在具体session启用。

1.在全局启用在参数文件(pfile/spfile)中指定: SQL_TRACE = true在全局启用SQL_TRACE会导致所有进程的活动被跟踪,包括后台进程及所有用户进程,这通常会导致比较严重的性能问题,所以在生产环境中要谨慎使用。

提示: 通过在全局启用SQL_TRACE,我们可以跟踪到所有后台进程的活动,很多在文档中的抽象说明,通过跟踪文件的实时变化,我们可以清晰的看到各个进程之间的紧密协调。

2.在当前session级设置大多数时候我们使用SQL_TRACE跟踪当前会话的进程。

plsql查看执行计划

plsql查看执行计划

plsql查看执行计划PL/SQL是一种结构化查询语言,它是Oracle数据库的一部分,用于编写存储过程、函数、触发器等数据库对象。

在编写PL/SQL代码时,我们经常需要查看执行计划来优化查询性能。

执行计划是Oracle数据库优化器生成的一种执行计划,它显示了数据库引擎执行SQL语句时使用的操作顺序和访问方法。

通过查看执行计划,我们可以了解数据库引擎是如何执行我们的SQL语句的,从而找到优化查询性能的方法。

要查看PL/SQL执行计划,我们可以使用Oracle数据库提供的一些工具和命令。

下面我将介绍一些常用的方法和工具。

首先,我们可以使用SQLPlus工具来查看PL/SQL执行计划。

SQLPlus是Oracle数据库提供的一个命令行工具,我们可以通过它连接到数据库并执行SQL语句。

要查看执行计划,我们可以在SQLPlus中执行以下命令:```sql。

EXPLAIN PLAN FOR。

SELECT FROM your_table;```。

上面的命令会生成一个执行计划并将其存储在数据库中。

我们可以使用以下命令来查看执行计划:```sql。

SELECT FROM TABLE(DBMS_XPLAN.DISPLAY);```。

这将显示刚刚生成的执行计划。

执行计划中包含了查询语句的执行顺序、访问方法、操作类型等信息,我们可以根据这些信息来优化查询性能。

除了SQLPlus,我们还可以使用SQL Developer工具来查看执行计划。

SQL Developer是Oracle提供的一个图形化的数据库开发工具,它集成了很多数据库管理和开发功能。

在SQL Developer中,我们可以通过以下步骤来查看执行计划:1. 打开SQL Developer,并连接到数据库。

2. 在SQL Worksheet中输入要查询的SQL语句。

3. 点击工具栏上的“Explain Plan”按钮,SQL Developer会生成执行计划并显示在一个新的窗口中。

oracle执行计划怎么看

oracle执行计划怎么看

oracle执行计划怎么看Oracle执行计划是数据库优化调优中非常重要的一环,通过查看执行计划可以了解SQL语句的执行情况,以及是否存在性能瓶颈。

那么,我们应该如何来看Oracle执行计划呢?首先,我们需要知道执行计划是什么。

执行计划是Oracle数据库对SQL语句执行的一种解释,它告诉我们Oracle是如何执行SQL语句的,包括使用了哪些索引、连接方式、表的扫描顺序等信息。

通过执行计划,我们可以分析SQL语句的性能瓶颈,并进行相应的优化。

接下来,我们来看一下如何查看执行计划。

在Oracle中,我们可以使用explain plan语句来查看执行计划。

例如:```sql。

explain plan for。

SELECT FROM employees WHERE department_id = 20;```。

执行以上SQL语句后,可以使用如下语句来查看执行计划:```sql。

select from table(dbms_xplan.display);```。

通过以上命令,我们可以得到SQL语句的执行计划,包括每个步骤的操作类型、表的访问方式、访问行数等信息。

通过这些信息,我们可以分析SQL语句的执行情况,找出性能瓶颈所在。

在查看执行计划时,我们需要注意一些重要的信息。

首先是操作类型,常见的操作类型包括全表扫描、索引扫描、排序等。

不同的操作类型对性能的影响是不同的,我们需要根据实际情况进行分析和优化。

其次是访问方式,包括了表的访问顺序、连接方式等信息。

合理的访问方式可以提高SQL语句的执行效率。

最后是访问行数,通过访问行数我们可以了解SQL语句实际操作的数据量,从而评估SQL语句的性能。

除了使用explain plan语句来查看执行计划外,我们还可以通过SQL Developer等工具来可视化地查看执行计划。

这些工具可以直观地展现SQL语句的执行情况,帮助我们更好地进行性能优化。

在实际的优化过程中,我们还可以通过修改SQL语句、创建索引、重新设计表结构等方式来改善执行计划,从而提高SQL语句的执行效率。

ORACLE数据库查看执行计划

ORACLE数据库查看执行计划

ORACLE数据库查看执⾏计划基于ORACLE的应⽤系统很多性能问题,是由应⽤系统SQL性能低劣引起的,所以,SQL的性能优化很重要,分析与优化SQL的性能我们⼀般通过查看该SQL的执⾏计划,本⽂就如何看懂执⾏计划,以及如何通过分析执⾏计划对SQL进⾏优化做相应说明。

⼀、什么是执⾏计划(explain plan)执⾏计划:⼀条查询语句在ORACLE中的执⾏过程或访问路径的描述。

⼆、如何查看执⾏计划1: 在PL/SQL下按F5查看执⾏计划。

第三⽅⼯具toad等。

很多⼈以为PL/SQL的执⾏计划只能看到基数、优化器、耗费等基本信息,其实这个可以在PL/SQL⼯具⾥⾯设置的。

可以看到很多其它信息,如下所⽰2: 在SQL*PLUS(PL/SQL的命令窗⼝和SQL窗⼝均可)下执⾏下⾯步骤SQL>EXPLAIN PLAN FORSELECT*FROM SCOTT.EMP; --要解析的SQL脚本SQL>SELECT*FROM TABLE(DBMS_XPLAN.DISPLAY);3: 在SQL*PLUS下(有些命令在PL/SQL下⽆效)执⾏如下命令:SQL>SET TIMING ON --控制显⽰执⾏时间统计数据SQL>SET AUTOTRACE ON EXPLAIN --这样设置包含执⾏计划、脚本数据输出,没有统计信息SQL>执⾏需要查看执⾏计划的SQL语句SQL>SET AUTOTRACE OFF --不⽣成AUTOTRACE报告,这是缺省模式SQL>SET AUTOTRACE ON --这样设置包含执⾏计划、统计信息、以及脚本数据输出SQL>执⾏需要查看执⾏计划的SQL语句SQL>SET AUTOTRACE OFFSQL>SET AUTOTRACE TRACEONLY --这样设置会有执⾏计划、统计信息,不会有脚本数据输出SQL>执⾏需要查看执⾏计划的SQL语句SQL>SET AUTOTRACE TRACEONLY STAT --这样设置只包含有统计信息SQL>执⾏需要查看执⾏计划的SQL语句SET AUTOT[RACE] {ON | OFF | TRACE[ONLY]} [EXP[LAIN]] [STAT[ISTICS]]参考⽂档:SQLPlus User’s Guide and Reference Release 11.1注意:PL/SQL Developer ⼯具并不完全⽀持所有的SQL*Plus命令,像SET AUTOTRACE ON 就如此,在PL/SQL Developer⼯具下执⾏此命令会报错SQL> SET AUTOTRACE ON;Cannot SET AUTOTRACE4:SQL_TRACE可以作为参数在全局启⽤,也可以通过命令形式在具体SESSION启⽤4.1 在全局启⽤,在参数⽂件(pfile/spfile)中指定SQL_TRACE =true,在全局启⽤SQL_TRACE时会导致所有进程活动被跟踪,包括后台进程以及⽤户进程,通常会导致⽐较严重的性能问题,所以在⽣产环境要谨慎使⽤。

Oracle中获取执行计划的几种方法分析

Oracle中获取执行计划的几种方法分析

Oracle中获取执⾏计划的⼏种⽅法分析Explain plan以SQL语句作为输⼊,得到这条SQL语句的执⾏计划,并将执⾏计划输出存储到计划表中。

在你要执⾏的SQL语句前加explain plan for,此时将⽣成的执⾏计划存储到计划表中,语句如下:explain plan for SQL语句在计划表中查询刚刚⽣成的执⾏计划,语句如下:select * from table(dbms_xplan.display);注意:Explain plan只⽣成执⾏计划,并不会真正执⾏SQL语句,因此产⽣的执⾏计划有可能不准,因为:1)当前的环境可能和执⾏计划⽣成时的环境不同;2)不会考虑绑定变量的数据类型;3)不进⾏变量窥视。

如果你想获取正在执⾏的或刚执⾏结束的SQL语句真实的执⾏计划(即获取library cache中的执⾏计划),可以到动态性能视图⾥查询。

⽅法如下:游标分为⽗游标和⼦游标,⽗游标由sql_id(或联合address和hash_value)字段表⽰,⼦游标由child_number字段表⽰。

如果SQL语句正在运⾏,可以从v$session中获得它的游标信息,如:select status, sql_id, sql_child_number from v$session where status='ACTIVE' and ....如果知道SQL语句包含某些关键字,可以从v$sql视图中获得它的游标信息,如:select sql_id, child_number, sql_text from v$sql where sql_text like '%关键字%‘为了获取缓存库中的执⾏计划,可以直接查询动态性能视图v$sql_plan和v$sql_plan_statistics_all等,但更⽅便的⽅法是以sql_id和⼦游标为参数,执⾏如下语句:select * from table(dbms_xplan.display_cursor('sql_id',child_number));set serveroutput offselect * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));AWR会定时把动态性能视图中的执⾏计划保存到dba_hist_sql_plan视图中,如果你想要查看历史执⾏计划,可以采⽤如下⽅法查询:select * from table(dbms_xplan.display_awr('sql_id');set autotrace是sqlplus⼯具的⼀个功能,只能在通过sqlplus连接的session中使⽤,它⾮常适合在开发时测试SQL语句的性能,有以下⼏种参数可供选择:SET AUTOTRACE OFF ---------------- 不显⽰执⾏计划和统计信息,这是缺省模式SET AUTOTRACE ON EXPLAIN ------ 只显⽰优化器执⾏计划SET AUTOTRACE ON STATISTICS -- 只显⽰统计信息SET AUTOTRACE ON ----------------- 执⾏计划和统计信息同时显⽰SET AUTOTRACE TRACEONLY ------ 不真正执⾏,只显⽰预期的执⾏计划,同explain planSQL_TRACE作为初始化参数可以在实例级别启⽤,也可以只在会话级别启⽤,在实例级别启⽤SQL_TRACE会导致所有进程的活动被跟踪,包括后台进程及所有⽤户进程,这通常会导致⽐较严重的性能问题,所以在⼀般情况下,我们使⽤sql_trace跟踪当前进程,⽅法如下:SQL>alter session set sql_trace=true;...被跟踪的SQL语句...SQL>alter session set sql_trace=false;如果要跟踪其它进程,可以通过Oracle提供的系统包DBMS_SYSTEM. SET_SQL_TRACE_IN_SESSION来实现,例SQL> exec dbms_system.set_sql_trace_in_session(sid,serial#,true) --开始跟踪SQL> exec dbms_system.set_sql_trace_in_session(sid,serial#,false) --结束跟踪⽣成trace⽂件后,再⽤tkprof ⼯具将sql trace ⽣成的跟踪⽂件转换成易读的格式,语法如下:tkprof inputfile outputfile10046事件是SQL_TRACE的⼀个升级版,它也是追踪会话,⽣成Trace⽂件,只是它⾥⾯的内容更详细,。

Dbeaver如何看Oralce执行计划?解决:explainplanFOR无效?执行计划。。。

Dbeaver如何看Oralce执行计划?解决:explainplanFOR无效?执行计划。。。

Dbeaver如何看Oralce执⾏计划?解决:explainplanFOR⽆效?执⾏计划。

此⽂转载⾃:https:///q258523454/article/details/112252826#commentBox假如有如下表结构和数据CREATE TABLE student(id number(10) PRIMARY KEY,name varchar(10) not NULL,name2 char(10) DEFAULT 'default' NOT NULL,age number(4)) tablespace TBS_CUR_DAT;COMMENT ON COLUMN IS '姓名';COMMENT ON COLUMN 2 IS '姓名2';COMMENT ON COLUMN student.age IS '年龄';CREATE UNIQUE INDEX STUDENT_IDX_01 on STUDENT (id,name);CREATE UNIQUE INDEX STUDENT_IDX_02 on STUDENT (age);ID NAME NAME2 AGE1 1 1 12 2 2 23 3 3 34 4 4 [NULL]在dbeaver中⽤explain plan FOR SELECT * from student;查看执⾏计划,发现没有任何反应(原因见后⽂)。

所以只能⽤⼯具来查看了,如何做呢?注意上⾯可能因为版本问题出现的坑: 如果执⾏计划没有任何反应,先删除“;”分号,重新加上然后再执⾏。

为什么⽤下⾯的⽅法查看不到执⾏计划呢?explain plan FOR SELECT * from student;原因是我们还少了⼀条查询SQL,上⾯只是⽣成执⾏计划,但是不会主动显⽰.explain plan FOR SELECT * from student;SELECT * FROM TABLE(dbms_xplan.display);执⾏计划如何看呢? 执⾏计划的执⾏顺序如何判断?答:树的后续遍历假如执⾏计划为:--------------------------------------------------| Id | Operation | Name |--------------------------------------------------| 0 | SELECT STATEMENT | ||* 1 | FILTER | || 2 | NESTED LOOPS | || 3 | TABLE ACCESS FULL | EMP || 4 | TABLE ACCESS BY INDEX ROWID| DEPT | |* 5 | INDEX UNIQUE SCAN | PK_DEPT ||* 6 | TABLE ACCESS FULL | SALGRADE | --------------------------------------------------画图:同理,下⾯的执⾏顺序为:。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于ORACLE的应用系统很多性能问题,是由应用系统SQL性能低劣引起的,所以,SQL的性能优化很重要,分析与优化SQL的性能我们一般通过查看该SQL的执行计划,本文就如何看懂执行计划,以及如何通过分析执行计划对SQL进行优化做相应说明一、什么是执行计划(explain plan)执行计划:一条查询语句在ORACLE中的执行过程或访问路径的描述。

二、如何查看执行计划1:在PL/SQL下按F5查看执行计划。

第三方工具toad等。

很多人以为PL/SQL的执行计划只能看到基数、优化器、耗费等基本信息,其实这个可以在PL/SQL工具里面设置的。

可以看到很多其它信息,如下所示2:在SQL*PLUS(PL/SQL的命令窗口和SQL窗口均可)下执行下面步骤复制代码代码如下:SQL>EXPLAIN PLAN FORSELECT*FROM SCOTT.EMP;--要解析的SQL脚本SQL>SELECT*FROM TABLE(DBMS_XPLAN.DISPLAY);3:在SQL*PLUS下(有些命令在PL/SQL下无效)执行如下命令:复制代码代码如下:SQL>SET TIMING ON--控制显示执行时间统计数据SQL>SET AUTOTRACE ON EXPLAIN--这样设置包含执行计划、脚本数据输出,没有统计信息SQL>执行需要查看执行计划的SQL语句SQL>SET AUTOTRACE OFF--不生成AUTOTRACE报告,这是缺省模式SQL>SET AUTOTRACE ON--这样设置包含执行计划、统计信息、以及脚本数据输出SQL>执行需要查看执行计划的SQL语句SQL>SET AUTOTRACE OFFSQL>SET AUTOTRACE TRACEONLY--这样设置会有执行计划、统计信息,不会有脚本数据输出SQL>执行需要查看执行计划的SQL语句SQL>SET AUTOTRACE TRACEONLY STAT--这样设置只包含有统计信息SQL>执行需要查看执行计划的SQL语句SET AUTOT[RACE]{ON|OFF|TRACE[ONLY]}[EXP[LAIN]][STAT[ISTICS]]参考文档:SQLPlus User's Guide and Reference Release11.1注意:PL/SQL Developer工具并不完全支持所有的SQL*Plus命令,像SET AUT OTRACE ON就如此,在PL/SQL Developer工具下执行此命令会报错SQL>SET AUTOTRACE ON;Cannot SET AUTOTRACE4:SQL_TRACE可以作为参数在全局启用,也可以通过命令形式在具体SESSION 启用4.1在全局启用,在参数文件(pfile/spfile)中指定SQL_TRACE=true,在全局启用SQL_TRACE时会导致所有进程活动被跟踪,包括后台进程以及用户进程,通常会导致比较严重的性能问题,所以在生产环境要谨慎使用。

提示:通过在全局启用SQL_TRACE,我们可以跟踪到所有后台进程的活动,很多在文档中的抽象说明,通过跟踪文件的实时变化,我们可以清晰的看到各个进程间的紧密协调。

4.2在当前SESSION级别设置,通过跟踪当前进程可以发现当前操作的后台数据库递归活动(这在研究数据库新特性时尤其有效),研究SQL执行时,发现后台错误等。

复制代码代码如下:SQL>ALTER SESSION SET SQL_TRACE=TRUE;SQL>SELECT*FROM SCOTT.EMP;SQL>ALTER SESSION SET SQL_TRACE=FALSE;那么此时如何查看相关信息?不管你在SQL*PLUS抑或PL/SQL DEVELOPER工具里面执行上面脚本过后都看不到什么信息,你可以通过下面脚本查询到trace日志信息复制代码代码如下:SELECT T.VALUE||'/'||LOWER(RTRIM(I.INSTANCE,CHR(0)))||'_ora_'||P.SPID||'.trc'TRACE_FILE_NAMEFROM(SELECT P.SPIDFROM V$MYSTAT M,V$SESSION S,V$PROCESS PWHERE M.STATISTIC#=1AND S.SID=M.SIDAND P.ADDR=S.PADDR)P,(SELECT T.INSTANCEFROM V$THREAD T,V$PARAMETER VWHERE ='thread'AND(V.VALUE=0OR T.THREAD#=TO_NUMBER(V.VALUE)))I,(SELECT VALUE FROM V$PARAMETER WHERE NAME='user_dump_dest')TTKPROF的帮助信息如下复制代码代码如下:TKPROF选项选项说明TRACEFILE跟踪输出文件的名称OUTPUTFILE已设置格式的文件的名称SORT=option语句的排序顺序PRINT=n打印前n个语句EXPLAIN=user/password以指定的用户名运行EXPLAIN PLANINSERT=filename生成INSERT语句SYS=NO忽略作为用户sys运行的递归SQL语句AGGREGATE=[Y|N]如果指定AGGREGATE=NO TKPROF不聚集相同SQL文本的多个用户RECORD=filename记录在跟踪文件中发现的语句TABLE=schema.tablename将执行计划放入指定的表而不是缺省的PLAN_TABLE可以在操作系统中键入tkprof以获得所有可用选项和输出的列表注排序选项有排序选项说明prscnt execnt fchcnt调用分析执行提取的次数prscpu execpu fchcpu分析执行提取所占用的CPU时间prsela exela fchela分析执行提取所占用的时间prsdsk exedsk fchdsk分析执行提取期间的磁盘读取次数prsqry exeqry fchqry分析执行提取期间用于持续读取的缓冲区数prscu execu fchcu分析执行提取期间用于当前读取的缓冲区数prsmis exemis分析执行期间库高速缓存未命中的次数exerow fchrow分析执行期间处理的行数userid分析游标的用户的用户IDTKPROF统计数据Count:执行调用数CPU:CPU的使用秒数Elapsed:总共用去的时间Disk:物理读取次数Query:持续读取的逻辑读取数Current:当前模式下的逻辑读取数Rows:已处理行数TKPROF统计信息统计含义Count分析或执行语句的次数以及为语句发出的提取调用数CPU每个阶段的处理时间以秒为单位如果在共享池中找到该语句对于分析阶段为0 Elapsed占用时间以秒为单位通常不是非常有用因为其它进程影响占用时间Disk从数据库文件读取的物理数据块如果该数据被缓冲则该统计可能很低Query为持续读取检索的逻辑缓冲区通常用于SELECT语句Current在当前模式下检索的逻辑缓冲区通常用于DML语句Rows外部语句所处理的行对于SELECT语句在提取阶段显示它对于DML语句在执行阶段显示它Query和Current的总和为所访问的逻辑缓冲区的总数执行下面命令:tkprof D:\ORACLE\PRODUCT\10.2.0\DB_1\RDBMS\TRACE/wgods_ora_3940.t rc h:\out.txtoutputfile explain=etl/etl执行上面命令后,可以查看生成的文本文件复制代码代码如下:TKPROF:Release10.2.0.1.0-Production on星期三5月2316:56:412012 Copyright(c)1982,2005,Oracle.All rights reserved.Trace file:D:\ORACLE\PRODUCT\10.2.0\DB_1\RDBMS\TRACE/wgods_ora_3940.trcSort options:default******************************************************************************* *count=number of times OCI procedure was executedcpu=cpu time in seconds executingelapsed=elapsed time in seconds executingdisk=number of physical reads of buffers from diskquery=number of buffers gotten for consistent readcurrent=number of buffers gotten in current mode(usually for update)rows=number of rows processed by the fetch or execute call******************************************************************************* *ALTER SESSION SET SQL_TRACE=TRUEcall count cpu elapsed disk query current rows-----------------------------------------------------------------------Parse00.000.000000Execute10.000.000000Fetch00.000.000000-----------------------------------------------------------------------Misses in library cache during parse:0Misses in library cache during execute:1Optimizer mode:CHOOSEParsing user id:89(ETL)******************************************************************************* *begin:id:=sys.dbms_transaction.local_transaction_id;end;call count cpu elapsed disk query current rows-----------------------------------------------------------------------Parse20.000.000000Execute20.000.000002Fetch00.000.000000-----------------------------------------------------------------------total40.000.000002Misses in library cache during parse:0Optimizer mode:CHOOSEParsing user id:89(ETL)******************************************************************************* *SELECT*FROMSCOTT.EMPcall count cpu elapsed disk query current rows-----------------------------------------------------------------------Execute10.000.000000Fetch10.000.0007014-----------------------------------------------------------------------total40.000.0007014Misses in library cache during parse:1Optimizer mode:CHOOSEParsing user id:89(ETL)Rows Execution Plan----------------------------------------------------------SELECT STATEMENT MODE:CHOOSETABLE ACCESS MODE:ANALYZED(FULL)OF'EMP'(TABLE)******************************************************************************* *ALTER SESSION SET SQL_TRACE=FALSEcall count cpu elapsed disk query current rows-----------------------------------------------------------------------Parse10.000.000000Execute10.000.000000Fetch00.000.000000-----------------------------------------------------------------------total20.000.000000Misses in library cache during parse:1Optimizer mode:CHOOSEParsing user id:89(ETL)*OVERALL TOTALS FOR ALL NON-RECURSIVE STATEMENTScall count cpu elapsed disk query current rows-----------------------------------------------------------------------Parse50.000.000000Execute50.000.000002Fetch10.000.0007014-----------------------------------------------------------------------total110.000.0007016Misses in library cache during parse:2Misses in library cache during execute:1OVERALL TOTALS FOR ALL RECURSIVE STATEMENTScall count cpu elapsed disk query current rows-----------------------------------------------------------------------Parse00.000.000000Execute00.000.000000Fetch00.000.000000-----------------------------------------------------------------------total00.000.000000Misses in library cache during parse:0user SQL statements in session.internal SQL statements in session.SQL statements in session.statement EXPLAINed in this session.*Trace file:D:\ORACLE\PRODUCT\10.2.0\DB_1\RDBMS\TRACE/wgods_ora_3940.trcTrace file compatibility:10.01.00Sort options:defaultsession in tracefile.user SQL statements in trace file.internal SQL statements in trace file.SQL statements in trace file.unique SQL statements in trace file.SQL statements EXPLAINed using schema:ETL.prof$plan_tableDefault table was used.Table was created.Table was dropped.lines in trace file.elapsed seconds in trace file.4.3跟踪其它用户的进程,在很多时候我们需要跟踪其它用户的进程,而不是当前用户,可以通过ORACLE提供的系统包DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION来完成。

相关文档
最新文档