精华内容
下载资源
问答
  • 2021-05-08 01:34:22

    查看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的支持。

    二、通过sqlplus

    1.最简单的办法

    Sql> set autotrace on

    Sql> select * from dual;

    执行完语句后,会显示explain plan 与 统计信息。

    这个语句的优点就是它的缺点,这样在用该方法查看执行时间较长的sql语句时,需要等待该语句执行成功后,才返回执行计划,使优化的周期大大增长。如果不想执行语句而只是想得到执行计划可以采用:

    Sql> set autotrace traceonly

    这样,就只会列出执行计划,而不会真正的执行语句,大大减少了优化时间。虽然也列出了统计信息,但是因为没有执行语句,所以该统计信息没有用处,如果执行该语句时遇到错误,解决方法为:

    (1)在要分析的用户下:

    Sqlplus > @ ?

    dbmsadminutlxplan.sql

    (2) 用sys用户登陆

    Sqlplus > @ ?sqlplusadminplustrce.sql

    Sqlplus > 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语句去优化。其实,在很多情况下,我们只会听一个客户抱怨说现在系统运行很慢,而我们不知道是哪个SQL引起的。此时有许多现成的语句可以找出耗费资源比较多的语句,如:

    SELECT ADDRESS, substr(SQL_TEXT,1,20) Text, buffer_gets, executions,

    buffer_gets/executions AVG  from  v$sqlarea

    WHERE executions>0 AND buffer_gets > 100000   ORDER BY 5;

    ADDRESS  &n

    更多相关内容
  • Oracle 查看执行计划

    千次阅读 2015-07-28 12:52:57
    我们可以通过 EXPLAIN PLAN 语句生成执行计划,该语句把执行计划保存到一个叫做 PLAN_TABLE 的表中,我们可以通过查询这个表来查看执行计划。下面是一个简单例子。 -- 生成执行计划 EXPLAIN PLAN SET ...

    -- Start

    EXPLAIN PLAN

    我们可以通过 EXPLAIN PLAN 语句生成执行计划,该语句把执行计划保存到一个叫做 PLAN_TABLE 的表中,我们可以通过查询这个表来查看执行计划。下面是一个简单例子。

    -- 生成执行计划
    EXPLAIN PLAN 
    SET STATEMENT_ID = 'test'
    FOR
    select * from employees where employee_id < 10;
    
    -- 由于 PLAN_TABLE 表非常复杂,Oracle 提供下面的方式察看执行计划
    SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE', 'test', 'ALL'));
    
    -- 如果你想察看更多细节,你也可以直接查询表
    select * from plan_table where statement_id = 'test'


    autotrace

    如果你使用的是 sqlplus 工具,你还可以通过它提供了 autotrace 功能来查看执行计划,你只需要下面的两步,非常简单,下面是一个简单的例子。

    -- 第一步: 打开 autotrace
    SQL> set autotrace on
    
    -- 第二步: 执行 SQL 语句
    SQL> select * from test;

    V$SQL_PLAN

    上面查看执行计划的方式有一个缺陷,它们必须由人触发,随着执行环境,时间,统计信息等的不同,执行计划有可能不同,有没有办法查看已经执行过 SQL 的执行计划呢?答案是肯定的,下面是一个简单的例子。

    -- 第一步: 通过下面的语句找到 SQL_ID 
    select SQL_ID,SQL_TEXT from v$sql 
    where sql_text like '%KAFKA_MSG_QUEUE%';
    
    -- 第二步: 通过下面的方式查看执行计划
    select * from V$SQL_PLAN where SQL_ID='g7b1uz8n2mdvf' 
    order by CHILD_NUMBER, id;
    
    -- 注意,上面的语句可以查询出该语句多次的执行计划,你可以加上时间来过滤
    select * from V$SQL_PLAN where SQL_ID='g7b1uz8n2mdvf' 
    and "TIMESTAMP"=TIMESTAMP '2015-08-20 19:38:06.000'
    order by CHILD_NUMBER, id
    
    -- 上面语句的结果可读性差,试一试下面的语句吧
    select '| Operation                         |Object Name                    |  Rows | Bytes|   Cost |'
    	as "Explain Plan in library cache:" from dual
    union all
    select rpad('| '||substr(lpad(' ',1*(depth-1))||operation||
           decode(options, null,'',' '||options), 1, 35), 36, ' ')||'|'||
           rpad(decode(id, 0, '----------------------------',
           substr(decode(substr(object_name, 1, 7), 'SYS_LE_', null, object_name)
           ||' ',1, 30)), 31, ' ')||'|'|| lpad(decode(cardinality,null,'  ',
           decode(sign(cardinality-1000), -1, cardinality||' ',
           decode(sign(cardinality-1000000), -1, trunc(cardinality/1000)||'K',
           decode(sign(cardinality-1000000000), -1, trunc(cardinality/1000000)||'M',
           trunc(cardinality/1000000000)||'G')))), 7, ' ') || '|' ||
           lpad(decode(bytes,null,' ',
           decode(sign(bytes-1024), -1, bytes||' ',
           decode(sign(bytes-1048576), -1, trunc(bytes/1024)||'K',
           decode(sign(bytes-1073741824), -1, trunc(bytes/1048576)||'M',
           trunc(bytes/1073741824)||'G')))), 6, ' ') || '|' ||
           lpad(decode(cost,null,' ', decode(sign(cost-10000000), -1, cost||' ',
           decode(sign(cost-1000000000), -1, trunc(cost/1000000)||'M',
           trunc(cost/1000000000)||'G'))), 8, ' ') || '|' as "Explain plan"
    from v$sql_plan sp
    where sp.SQL_ID='g7b1uz8n2mdvf' 
    and "TIMESTAMP"=TIMESTAMP '2015-08-20 19:38:06.000';


    怎么样?看不懂执行计划?看看下面的文章吧?

    Oracle 查询优化器 -- 改写查询语句
    Oracle 查询优化器 -- 访问路径
    Oracle 查询优化器 -- 表连接方法

    如果你觉得执行计划有问题,那么很有可能是因为表或索引的统计信息没有更新,不知道怎么查看统计信息?看看 《Oracle 查看收集统计信息》 吧

    --  更多参见:Oracle SQL 优化精萃

    -- 声明:转载请注明出处

    -- Last edited on 2015-08-28

    -- Created by ShangBo on 2015-07-28

    -- End


    展开全文
  • Oracle查询执行计划

    千次阅读 2022-04-21 14:16:02
    执行计划(Execution Plan)也叫查询计划(Query Plan),它是数据库执行SQL语句的具体步骤和过程。SQL查询语句的执行计划主要包括: ● 访问表的方式。数据库通过索引或全表扫描等方式访问表中的数据。 ● 多表...

    执行计划(Execution Plan)也叫查询计划(Query Plan),它是数据库执行SQL语句的具体步骤和过程。SQL查询语句的执行计划主要包括:

    ● 访问表的方式。数据库通过索引或全表扫描等方式访问表中的数据。
    ● 多表连接的方式。数据库使用什么连接算法实现表的连接,包括多个表的先后访问顺序。
    ● 分组聚合以及排序等操作的实现方式。

    虽然不同数据库对于SQL查询的执行过程采用了不同的实现方式,但是一个查询语句大致需要经过分析器、优化器以及执行器的处理并返回最终结果,同时还可能利用各种缓存来提高访问性能。

    简单来说,一个查询语句从客户端的提交开始,直到服务器返回最终的结果,整个过程大致如图所示。

    首先,客户端提交SQL语句。在此之前客户端必须连接到数据库服务器,图中的连接器就是负责建立和管理客户端连接的组件。

    然后,分析器(解析器)解析SQL语句的各个组成部分,进行语法分析,并检查SQL语句的语法是否符合规范。

    例如,以下语句中的FROM关键字错写成了FORM:

    在这种情况下,所有的数据库管理系统都会返回一个语法错误。

    然后,优化器会利用数据库收集到的统计信息决定SQL语句的最佳执行方式。例如,是通过索引还是通过全表扫描的方式访问单个表,使用什么顺序连接多个表,如何实现数据的排序等。

    优化器是决定查询性能的关键组件,而数据库的统计信息是优化器判断的基础。

    最后,执行器根据优化之后的执行计划调用相应的执行模块来获取数据,并将结果返回客户端。

    执行计划的查看方式

    方法一:语句查看

    在Oracle数据库中,我们同样可以使用EXPLAIN PLAN FOR命令生成执行计划,不过需要执行两条命令:

    EXPLAIN PLAN FOR
    
    SELECT * FROM  T_USER1 t where t.user_name = 'Admin';
    
    SELECT * FROM  TABLE(dbms_xplan.display);

    使用EXPLAIN PLAN FOR命令生成执行计划,并将其存储到系统表PLAN_TABLE中,然后通过一个查询语句显示生成的执行计划。


    其中dbms_xplan.display是一个Oracle系统函数。返回的结果显示,该语句在Oracle中是通过'SYS_C0016771'索引范围扫描来查找数据的。

    方法二:利用工具查看

    在常用的Oracle数据库开发工具PL/SQL中,选择一段SQL脚本,按F5键,即可自动显示该脚本的执行计划信息,跟方法一查询出的结果相同。

    执行过程分析

    参考下面文章:

    PLSQL_性能优化系列15_Oracle Explain Plan解析计划解读 - 东方瀚海 - 博客园

    在Oracle数据库中,我们可以通过系统表user_indexes和user_ind_columns查询索引以及相关的字段信息。

    SELECT * FROM  user_indexes;
    
    SELECT * FROM  user_ind_columns;
    展开全文
  • Oracle执行计划——查看执行计划的方法

    万次阅读 多人点赞 2018-09-12 17:17:43
    执行计划是一条查询语句在Oracle中的执行过程或访问路径的描述。 (2)执行计划的选择 通常一条SQL有多个执行计划,那我们如何选择?那种执行开销更低,就意味着性能更好,速度更快,我们就选哪一种,这个过程叫做...

    (1)什么是执行计划
    SQL是一种傻瓜式语言,每一个条件就是一个需求,访问的顺序不同就形成了不同的执行计划。Oracle必须做出选择,一次只能有一种访问路径。执行计划是一条查询语句在Oracle中的执行过程或访问路径的描述


    (2)执行计划的选择

    通常一条SQL有多个执行计划,那我们如何选择?那种执行开销更低,就意味着性能更好,速度更快,我们就选哪一种,这个过程叫做Oracle的解析过程,然后Oracle会把更好的执行计划放到SGA的Shared Pool里,后续再执行同样的SQL只需在Shared Pool里获取就行了,不需要再去分析


    (3)执行计划选定依据

    根据统计信息来选择执行计划。


    (4)统计信息
    什么是统计信息: 记录数、块数等,具体查看dba_tables / dba_indexes


    (5)动态采样

    Oracle正常情况下会在每天的某段时间收集统计信息,对于新建的表,Oracl如何收集统计信息?采用动态采样。
    set autotrace on
    set linesize 1000
    --执行SQL语句
    --会出现dynamic sampling used for this statement(level=2)关键


     

    (一)六种执行计划

    Oracle提供了6种执行计划获取方法,各种方法侧重点不同:

    选择时一般遵循以下规则:
    1.如果sql执行很长时间才出结果或返回不了结果,用方法1:explain plan for
    2.跟踪某条sql最简单的方法是方法1:explain plan for,其次是方法2:set autotrace on
    3.如果相关察某个sql多个执行计划的情况,只能用方法4:dbms_xplan.display_cursor或方法6:awrsqrpt.sql
    4.如果sql中含有函数,函数中有含有sql,即存在多层调用,想准确分析只能用方法5:10046追踪
    5.想法看到真实的执行计划,不能用方法1:explain plan for和方法2:set autotrace on
    6.想要获取表被访问的次数,只能用方法3:statistics_level = all

    获取方法优点缺点

    [explain plan for] plsql按F5

     

    explain plan for select * from dual;

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

    无需真正执行,快捷方便1.没有输出相关统计信息,例如产生了多少逻辑读,多少次物理读,多少次递归调用的情况;
    2.无法判断处理了多少行;
    3.无法判断表执行了多少次

    [set autotrace on]-sql*plus

     

    set autotrace on

    select * from dual;

    1.可以输出运行时的相关统计信息(产生多少逻辑读、多少次递归调用、多少次物理读等);

    2.虽然要等语句执行完才能输出执行计划,但是可以有traceonly开关来控制返回结果不打屏输出

    1.必须要等SQL语句执行完,才出结果

    2.无法看到表被访问了多少次;

    [statistics_level=all]

     

    alter session set statistics_level=all;

    select * from dual;

    select * from table(dbms_xplan.display_cursor(‘sql_id/hash_value’,null,'allstats last'));

    1.可以清晰的从starts得出表被访问多少次;

    2.可以从E-Rows和A-Rows得到预测的行数和真实的行数,从而可以准确判断Oracle评估是否准确;

    3.虽然没有准确的输出运行时的相关统计信息,但是执行计划中的Buffers就是真实的逻辑读的数值;

    1.必须要等执行完后才能输出结果;

    2.无法控制结果打屏输出,不像autotrace可以设置traceonly保证不输出结果;

    3.看不出递归调用,看不出物理读的数值

    [dbms_xplan.display_cursor]

     

    select * from table( dbms_xplan.display_cursor('&sql_id') );

    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:找到跟踪后产生的文件(开启10046前先用‘ls -lrt’看一下文件,执行结束后再看哪个是多出来的文件即可)
    步骤5:tkprof trc文件 目标文件 sys=no sort=prsela,exeela,fchela --格式化命令

    1.可以看出sql语句对应的等待事件;

    2.如果函数中有sql调用,函数中有包含sql,将会被列出,无处遁形;

    3.可以方便的看处理的行数,产生的逻辑物理读;

    4.可以方便的看解析时间和执行时间;

    5.可以跟踪整个程序包

    1.步骤繁琐;

    2.无法判断表被访问了多少次;

    3.执行计划中的谓词部分不能清晰的展现出来

     

     

     


    附录:


    (0)Oracle如何收集统计信息

    ① Oracle会选择在一个特定的时间段收集表和索引的统计信息(默认周一至周五:22:00,周六周日:06:00),用户可自行调整,主要为了避开高峰期;
    ② 表与索引的分析有阈值限制,超过阈值才会自动进行分析。如果数据变化量不大,Oracle是不会去分析的;
    ③ 收集方式灵活。可针对分区表的某个分区进行,可采用并行机制来收集表和索引的信息;


    如何收集统计信息
    --收集表统计信息

    exec dbms_stats.gather_table_stats(ownname => 'AAA', tabname => 'TEST02',estimate_percent =>
    10,method_opt => 'for all indexed columns');

    --收集索引统计信息

    exec dbms_stats.gather_index_stats(ownname => 'AAA',indname => 'ID_IDX',estimate_percent =>
    10,degree => '4');

    --收集表与索引的统计信息

    exec dbms_stats.gather_table_stats(ownname => 'AAA',tabname => 'TEST02',estimate_percent =>
    10,method_opt => 'for all indexed columns',cascade => true);

    (1)explain plan for

    SQL> show user
         USER 为 "HR"
    SQL> set linesize 1000
    SQL> set pagesize 2000
    SQL> explain plan for
    2 select *
    3 from employees,jobs
    4 where employees.job_id=jobs.job_id
    5 and employees.department_id=50;
    已解释。
    
    SQL> select * from table(dbms_xplan.display());
    
    PLAN_TABLE_OUTPUT
    ------------------------------------------------------------------------------------------------------------------------
    ----------------------------------------------------
    Plan hash value: 303035560
    ------------------------------------------------------------------------------------------
    | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
    ------------------------------------------------------------------------------------------
    | 0 | SELECT STATEMENT | | 45 | 4590 | 6 (17)| 00:00:01 |
    | 1 | MERGE JOIN | | 45 | 4590 | 6 (17)| 00:00:01 |
    | 2 | TABLE ACCESS BY INDEX ROWID| JOBS | 19 | 627 | 2 (0)| 00:00:01 |
    | 3 | INDEX FULL SCAN | JOB_ID_PK | 19 | | 1 (0)| 00:00:01 |
    |* 4 | SORT JOIN | | 45 | 3105 | 4 (25)| 00:00:01 |
    |* 5 | TABLE ACCESS FULL | EMPLOYEES | 45 | 3105 | 3 (0)| 00:00:01 |
    ------------------------------------------------------------------------------------------
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    4 - access("EMPLOYEES"."JOB_ID"="JOBS"."JOB_ID")
    filter("EMPLOYEES"."JOB_ID"="JOBS"."JOB_ID")
    5 - filter("EMPLOYEES"."DEPARTMENT_ID"=50)
    已选择19行。

    优点:无需真正执行,快捷方便
    缺点:1.没有输出相关统计信息,例如产生了多少逻辑读,多少次物理读,多少次递归调用的情况;
    2.无法判断处理了多少行;
    3.无法判断表执行了多少次
     


    (2)set autotrace on

    用法:
    命令作用
    SET AUTOT[RACE] OFF 停止AutoTrace
    SET AUTOT[RACE] ON 开启AutoTrace,显示AUTOTRACE信息和SQL执行结果
    SET AUTOT[RACE] TRACEONLY 开启AutoTrace,仅显示AUTOTRACE信息
    SET AUTOT[RACE] ON EXPLAIN 开启AutoTrace,仅显示AUTOTRACE的EXPLAIN信息
    SET AUTOT[RACE] ON STATISTICS 开启AutoTrace,仅显示AUTOTRACE的STATISTICS信息

    SQL> set autotrace on
    SQL> select * from employees,jobs where employees.job_id=jobs.job_id and employees.department_id=50;
    --输出结果(略)
    -- ...
    已选择45行。
    
    执行计划
    ----------------------------------------------------------
    Plan hash value: 303035560
    ------------------------------------------------------------------------------------------
    | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
    ------------------------------------------------------------------------------------------
    | 0 | SELECT STATEMENT | | 45 | 4590 | 6 (17)| 00:00:01 |
    | 1 | MERGE JOIN | | 45 | 4590 | 6 (17)| 00:00:01 |
    | 2 | TABLE ACCESS BY INDEX ROWID| JOBS | 19 | 627 | 2 (0)| 00:00:01 |
    | 3 | INDEX FULL SCAN | JOB_ID_PK | 19 | | 1 (0)| 00:00:01 |
    |* 4 | SORT JOIN | | 45 | 3105 | 4 (25)| 00:00:01 |
    |* 5 | TABLE ACCESS FULL | EMPLOYEES | 45 | 3105 | 3 (0)| 00:00:01 |
    ------------------------------------------------------------------------------------------
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    4 - access("EMPLOYEES"."JOB_ID"="JOBS"."JOB_ID")
    filter("EMPLOYEES"."JOB_ID"="JOBS"."JOB_ID")
    5 - filter("EMPLOYEES"."DEPARTMENT_ID"=50)
    统计信息
    ----------------------------------------------------------
    0 recursive calls
    0 db block gets
    13 consistent gets
    0 physical reads
    0 redo size
    5040 bytes sent via SQL*Net to client
    433 bytes received via SQL*Net from client
    4 SQL*Net roundtrips to/from client
    1 sorts (memory)
    0 sorts (disk)
    45 rows processed

    优点:1.可以输出运行时的相关统计信息(产生多少逻辑读、多少次递归调用、多少次物理读等);
                2.虽然要等语句执行完才能输出执行计划,但是可以有traceonly开关来控制返回结果不打屏输出
    缺点:1.必须要等SQL语句执行完,才出结果;
                2.无法看到表被访问了多少次;


    (3)statistics_level=all

    步骤一:ALTER SESSION SET STATISTICS_LEVEL=ALL;
    步骤二:执行待分析的SQL
    步骤三:select * from table(dbms_xplan.display_cursor(‘sql_id/hash_value’,null,'allstats last'));

    SQL> alter session set statistics_level=all;
    SQL> select * from employees,jobs where employees.job_id=jobs.job_id and employees.department_id=50;
    --输出结果
    --...
    已选择45行。
    
    SQL> set linesize 1000
    SQL> select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));
    
    PLAN_TABLE_OUTPUT
    ------------------------------------------------------------------------------------------------------------------------
    -----------
    SQL_ID d8jzhcdwmd9ut, child number 0
    -------------------------------------
    select * from employees,jobs where employees.job_id=jobs.job_id and
    employees.department_id=50
    Plan hash value: 303035560
    ------------------------------------------------------------------------------------------------------------------------
    ----------------
    | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | Reads | OMem |
    1Mem | Used-Mem |
    ------------------------------------------------------------------------------------------------------------------------
    ----------------
    | 0 | SELECT STATEMENT | | 1 | | 45 |00:00:00.01 | 13 | 8 | |
    | |
    PLAN_TABLE_OUTPUT
    ------------------------------------------------------------------------------------------------------------------------
    -------------
    | 1 | MERGE JOIN | | 1 | 45 | 45 |00:00:00.01 | 13 | 8 | |
    | |
    | 2 | TABLE ACCESS BY INDEX ROWID| JOBS | 1 | 19 | 19 |00:00:00.01 | 6 | 2 | |
    | |
    | 3 | INDEX FULL SCAN | JOB_ID_PK | 1 | 19 | 19 |00:00:00.01 | 3 | 1 | |
    | |
    |* 4 | SORT JOIN | | 19 | 45 | 45 |00:00:00.01 | 7 | 6 | 6144 |
    6144 | 6144 (0)|
    |* 5 | TABLE ACCESS FULL | EMPLOYEES | 1 | 45 | 45 |00:00:00.01 | 7 | 6 | |
    | |
    ------------------------------------------------------------------------------------------------------------------------
    ----------------
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    4 - access("EMPLOYEES"."JOB_ID"="JOBS"."JOB_ID")
    PLAN_TABLE_OUTPUT
    ------------------------------------------------------------------------------------------------------------------------
    -----
    filter("EMPLOYEES"."JOB_ID"="JOBS"."JOB_ID")
    5 - filter("EMPLOYEES"."DEPARTMENT_ID"=50)
    已选择25行。

    关键字解读:
    1.starts:SQL执行的次数;
    2.E-Rows:执行计划预计返回的行数;
    3.R-Rows:执行计划实际返回的行数;
    4.A-Time:每一步执行的时间(HH:MM:SS.FF),根据这一行可知SQL耗时在哪些地方;
    5.Buffers:每一步实际执行的逻辑读或一致性读;
    6.Reads:物理读;

    优点:1.可以清晰的从starts得出表被访问多少次
                2.可以从E-Rows和A-Rows得到预测的行数和真实的行数,从而可以准确判断Oracle评估是否准确
                3.虽然没有准确的输出运行时的相关统计信息,但是执行计划中的Buffers就是真实的逻辑读的数值
    缺点:1.必须要等执行完后才能输出结果;
                2.无法控制结果打屏输出,不像autotrace可以设置traceonly保证不输出结果;
                3.看不出递归调用,看不出物理读的数值


    (4)dbms_xplan.display_cursor获取


    步骤1:select * from table( dbms_xplan.display_cursor('&sql_id') ); --该方法是从共享池得到
    注释:
    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('&sql_id',1));
    */
    SQL> select * from table(dbms_xplan.display_cursor('5hkd01f03y43d'));
    PLAN_TABLE_OUTPUT
    --------------------------------------------------------------------------------
    SQL_ID 5hkd01f03y43d, child number 0
    -------------------------------------
    select * from test where table_name = 'LOG$'
    Plan hash value: 2408911181
    --------------------------------------------------------------------------------
    | Id | Operation | Name | Rows | Bytes | Cost (%CPU)|
    --------------------------------------------------------------------------------
    | 0 | SELECT STATEMENT | | | | 2 (100)|
    | 1 | TABLE ACCESS BY INDEX ROWID| TEST | 1 | 241 | 2 (0)|
    |* 2 | INDEX RANGE SCAN | IDX_TEST_1 | 1 | | 1 (0)|
    --------------------------------------------------------------------------------
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    2 - access("TABLE_NAME"='LOG$')
    19 rows selected

    注释:如何查看1个sql语句的sql_id,可直接查看v$sql

    优点:1.知道sql_id即可得到执行计划,与explain plan for一样无需执行
                2.可得到真实的执行计划
    缺点:1.没有输出运行的统计相关信息;
                2.无法判断处理了多少行;
                3.无法判断表被访问了多少次;
     


    (5)事件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:找到跟踪后产生的文件(开启10046前先用‘ls -lrt’看一下文件,执行结束后再看哪个是多出来的文件即可)
    步骤5:tkprof trc文件 目标文件 sys=no sort=prsela,exeela,fchela --格式化命令

    详细demo可见《附录1:10046追踪demo》

    优点:1.可以看出sql语句对应的等待事件;
                2.如果函数中有sql调用,函数中有包含sql,将会被列出,无处遁形;
                3.可以方便的看处理的行数,产生的逻辑物理读;
                4.可以方便的看解析时间和执行时间;
                5.可以跟踪整个程序包
    缺点:1.步骤繁琐;
                2.无法判断表被访问了多少次;
                3.执行计划中的谓词部分不能清晰的展现出来
     


    (6)awrsqrpt.sql


    步骤1:@?/rdbms/admin/awrsqrpt.sql
    步骤2:选择你要的断点(begin snap和end snap)
    步骤3:输入要查看的sql_id


    详细demo可见《附录2:使用awrsqrpt.sql查看执行计划》


     

     

    展开全文
  • Oracle 查看 SQL执行计划 SQL性能分析

    万次阅读 多人点赞 2019-01-05 09:41:25
    使用Oracle执行计划分析SQL性能 博客分类:  db oracle执行计划sql性能解释  执行计划可以用来分析SQL的性能   一、查看执行计划的方法 1. 设置autotrace  set autotrace off: 此为默认值,即关闭...
  • select * from ntts asd where asd.account='408050' and asd.userid='10000000557720' 5yt2dzpnhz1x7 1762625447 0
  • 一、什么是执行计划(explain plan) ...执行计划查看的几种方法 1.如果用的是oracle SQL developer的话,你可以按F10 2.use DBMS_XPLAN (在oracle SQL developer和 sqlplus上都可以) The DBMS_XPLAN packa
  • Oracle查询SQL语句执行的耗时 2018年07月10日 19:11:44 码农云帆哥 阅读数:1106  版权声明:本文为博主原创文章,未经博主允许不得转载。原创不易,转载请注明出处。 https://blog.csdn.net/sinat_27933...
  • 浅析Oracle查看执行计划的三种方式

    千次阅读 2017-03-20 16:12:46
    第一种方式:使用 set autotrace 命令查看执行计划备注:使用set autotrace 命令,这个命令只能在oracle的自带工具SQL Plus下运行。=============== SET AUTOTRACE参数 五种选择 ===============1. SET AUTOTRACE ...
  • 查看Oracle执行计划的几种常用方法-系列1

    万次阅读 多人点赞 2014-08-30 22:08:15
    SQL的执行计划实际代表了目标SQL在Oracle数据库内部的具体执行步骤,作为调优,只有知道了优化器选择的执行计划是否为当前情形下最优的执行计划,才能够知道下一步往什么方向。 执行计划的定义:执行目标SQL的...
  • ORACLE数据库查看执行计划

    千次阅读 2018-09-25 10:12:50
    基于ORACLE的应用系统很多性能问题,是由应用系统SQL性能低劣引起的,所以,SQL的性能优化很重要,分析与优化SQL的性能我们一般通过查看该SQL的执行计划,本文就如何看懂执行计划,以及如何通过分
  • Navicat中Oracle执行计划

    千次阅读 2018-11-06 10:35:32
    explain plan for 要执行的语句; select * from table(dbms_xplan.display);
  • Oracle执行计划详解

    千次阅读 2021-03-31 13:43:51
    执行计划是一条查询语句在Oracle中的执行过程或访问路径的描述。 组成 目标SQL的正文、sql_id和执行计划对应的plan_hash_value 执行计划主体,主要有内部执行步骤、执行顺序、谓词信息、列信息、Cardinality...
  • Oracle执行计划

    千次阅读 2021-09-21 00:39:56
    如何查看执行计划 set autotrace on set autotrace on explain set autotrace on statistics select * from jobs; 执行计划 统计信息 explain plan for select * from jobs; select * from table(dbms_xplan....
  • :只会显示SQL执行结果的数量,不显示执行结果的内容,适用于刷屏的SQL,还会显示执行计划和资源消耗。 SET AUTOTRACE TRACEONLY(SET AUTOT TRACE) EXPLAIN :只显示SQL执行计划,不显示SQL的资源消耗和...
  • 看懂Oracle执行计划

    千次阅读 2021-04-25 10:12:12
    二:怎样查看Oracle执行计划? 因为我一直用的PLSQL远程连接的公司数据库,所以这里以PLSQL为例: ①:配置执行计划需要显示的项: 工具 —> 首选项 —> 窗口类型 —> 计划窗口 —> 根据需要配置要显示...
  • 查看执行计划,发现没有任何反应。 CREATE TABLE student ( id number(10) PRIMARY KEY, name varchar(10) not NULL, name2 char(10) DEFAULT 'default' NOT NULL, age number(4) ) tablespac
  • Oracle通过执行计划查看查询语句是否使用索引

    万次阅读 多人点赞 2018-11-27 12:46:44
    1.生成执行计划 explain plan for select * from t_call_records where t_bjhm='123456' ...2.查看执行计划结果 select * from table(dbms_xplan.display)    如上图所示,TABLE ACCESS FUL...
  • oracle 查看正在执行的sql

    千次阅读 2022-01-26 14:27:28
    Oracle查看当前执行的SQLhttps://www.cndba.cn/hbhe0316/article/4914 https://www.cndba.cn/hbhe0316/article/4914 https://www.cndba.cn/hbhe0316/article/4914 https://www.cndba.cn/hbhe0316/article/...
  • Oracle 执行计划详解(预估 + 真实)

    万次阅读 多人点赞 2020-05-19 16:43:35
    文章目录1 概述1.1 思维导图1.2 概念2 执行计划2.1 预估的2.2 真实的3 示例4 备选命令 1 概述 什么是 Oracle执行计划执行计划是一条查询语句...oracle执行计划是很复杂的,一般我们看到的执行计划都是 oracle
  • ORACLE执行计划中的执行顺序

    千次阅读 2019-01-25 12:21:39
    执行计划查看规则:(从上往下,从右往左) 先从开头一直连续往右看,直到看到右边并列的地方;对于不并列的,靠右的先执行;如果看到并列,从上往下看,对于并列的部分,靠上的先执行。 参考网站:...
  • 背景:本渣目前的工作是oracle数据库开发,刚从mysql...本文只讲述oracle执行计划的执行顺序,不涉及执行计划的具体底层活动(即每一步是干了什么,怎么实现的)。 如图,这是一个树形执行计划 文本格式: 那...
  • Oracle执行计划之explain plan for

    千次阅读 2018-11-20 20:15:45
    最近一直在跟Oracle打交道,从最初的一脸懵逼到现在的略有所知,也来总结一下自己最近所学,不定时更新ing… &amp;nbsp; 一:什么是Oracle执行计划?...二:怎样查看Oracle执行计划? 因为我...
  • Oracle 分区执行计划详解

    千次阅读 2019-09-17 17:24:22
    在F5中查看执行计划的时候总是看到很多信息: range分区 执行计划中出现的: 分区表,按 n1 ,n2 分区 partition range single:访问单个分区 partition range iterator:访问多个分区 ---执行计划中的 PSTART/PS...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 700,810
精华内容 280,324
关键字:

oracle查看执行计划