iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Oracle中如何查看执行计划
  • 937
分享到

Oracle中如何查看执行计划

2024-04-02 19:04:59 937人浏览 薄情痞子
摘要

这篇文章主要介绍了oracle中如何查看执行计划,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。方法一、通过使用工具PLsql Develop

这篇文章主要介绍了oracle中如何查看执行计划,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

方法一、通过使用工具PLsql Developer中的Explain Plan Window窗口查看SQL执行计划。具体参考

             https://www.cnblogs.com/Dreamer-1/p/6076440.html

方法二、通过SQL*PLUS中的autotrace命令查看

            1.登录拥有dba权限的用户,分别执行

               脚本 ${ORACLE_HOME}/RDBMS/ADMIN/utlxplan.sql和

               脚本 ${ORACLE_HOME}/sqlplus/admin/plustrce.sql

               然后通过SQL*PLUS就可以查看执行计划了

            2.查看执行计划有下面四种选项

                1> set autotrace on    --(得到执行计划,并输出结果)

                2> set autotrace traceonly    --(得到执行计划,但不输出结果)

                3> set autotrace traceonly explain    --(得到执行计划,不输出统计信息和结果,仅展现执行计划部分)

                4> set autotrace traceonly statistics    --(不输出执行计划和结果,仅展现统计信息)

            3.优缺点

                优点:

                    1> 可以输出运行时的相关统计信息(产生多少逻辑读,多少递归调用,多少次物理读的情况)

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

                缺点:

                    1> 必须等语句执行完毕后,才可以出结果

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

方法三、explain plan for获取

            1.执行步骤如下:

                SQL> set linesize 200;

                SQL> set pagesize 2000;

                SQL> explain plan for select * from emp;

                Explained

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

                PLAN_TABLE_OUTPUT

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

                Plan hash value: 3956160932

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

                | Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |

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

                |   0 | SELECT STATEMENT  |      |    14 |   532 |     3   (0)| 00:00:01 |

                |   1 |  TABLE ACCESS FULL| EMP  |    14 |   532 |     3   (0)| 00:00:01 |

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

                8 rows selected

            2.优缺点

                优点:

                    1> 无需真正执行,快捷方便

                缺点:

                    1> 没有输出相关的统计信息(产生多少次逻辑读,多少次物理读,多少次递归调用)

                    2> 无法判断处理了多少行

                    3> 无法判断表被访问了多少次

方法四、statistics_level = all 或者

            1.执行步骤

                1> 通过statistics_level = all

                    SQL> set linesize 500;

                    SQL> set pagesize 1000;

                    SQL> alter session set statistics_level = all;

                    会话已更改。

                    SQL> select count(*) from emp;

                      COUNT(*)

                    ----------

                            14

                    SQL> select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));

                    PLAN_TABLE_OUTPUT

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

                    SQL_ID  g59vz2u4cu404, child number 0

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

                    select count(*) from emp

                    Plan hash value: 2937609675

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

                    | Id  | Operation        | Name   | Starts | E-Rows | A-Rows |   A-Time   | Buffers |

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

                    |   0 | SELECT STATEMENT |        |      1 |        |      1 |00:00:00.01 |       1 |

                    |   1 |  SORT AGGREGATE  |        |      1 |      1 |      1 |00:00:00.01 |       1 |

                    |   2 |   INDEX FULL SCAN| PK_EMP |      1 |     14 |     14 |00:00:00.01 |       1 |

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

                    已选择14行。

                2> 通过

                    SQL> set linesize 200;

                    SQL> set pagesize 500;

                    SQL> select count(*) from emp;

                      COUNT(*)

                    ----------

                            14

                    SQL> select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));

                    PLAN_TABLE_OUTPUT

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

                    SQL_ID  537ffv2MQ5375, child number 0

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

                    select count(*) from emp

                    Plan hash value: 2937609675

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

                    | Id  | Operation        | Name   | Starts | E-Rows | A-Rows |   A-Time   | Buffers |

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

                    |   0 | SELECT STATEMENT |        |      1 |        |      1 |00:00:00.01 |       1 |

                    |   1 |  SORT AGGREGATE  |        |      1 |      1 |      1 |00:00:00.01 |       1 |

                    |   2 |   INDEX FULL SCAN| PK_EMP |      1 |     14 |     14 |00:00:00.01 |       1 |

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

                    已选择14行。

            2.关键字解读

                1> Starts:该SQL执行的次数

                2> E-Rows:执行计划预计的行数。

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

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

                5> Buffers:每一步执行的逻辑读或一致性读

            3.优缺点

                优点

                    1> 可以清晰的从Starts得出表被访问多少

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

                    3> 虽然没有专门的输出运行时的相关统计信息,但是执行计划中的buffers就是真实的逻辑读的多少

                缺点

                    1> 必须等语句真正执行完毕后,才可以得出结果

                    2> 无法控制记录输屏打出,不像autotace由traceonly可以不将结果打屏输出

                    3> 看不出递归调用次数,看不出物理读的多少(不过逻辑读才是重点)

方法五、通过dbms_xplan.display_cursor(&sql_id)输入sql_id参数获取

            1.执行步骤

                SQL> select sql_id from sys.v_$sql t where t.sql_text like '%select count(*) from emp';

                SQL_ID

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

                g59vz2u4cu404

                SQL> select * from table(dbms_xplan.display_cursor('g59vz2u4cu404'));

                PLAN_TABLE_OUTPUT  

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

                SQL_ID  g59vz2u4cu404, child number 0

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

                select count(*) from emp

                

                Plan hash value: 2937609675

                

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

                | Id  | Operation        | Name   | Rows  | Cost (%CPU)| Time     |

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

                |   0 | SELECT STATEMENT |        |       |     1 (100)|          |

                |   1 |  SORT AGGREGATE  |        |     1 |            |          |

                |   2 |   INDEX FULL SCAN| PK_EMP |    14 |     1   (0)| 00:00:01 |

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

                已选择14行。

            2.优缺点

                优点:

                    1> 知道sql_id立即可得到执行计划,和explain plan for一样无需执行

                    2> 可以得到真实的执行计划

                缺点:

                    1> 没有输出运行的相关统计信息(产生的物理读,逻辑读,递归调用次数)

                    2> 无法判断处理了多少行

                    3> 无法判断表被访问了多少次

方法六、10046 trace跟踪

            1.执行步骤 

                Step1:alter session setevents '10046 trace name context forever,level 12'; (开启跟踪)

                Step2:执行sql

                Step3:alter session setevents '10046 trace name context off';   (关闭跟踪)

                Step4:步骤4:找到跟踪后产生的文件

                Step5:tkprof  trc文件  目标文件 sys=no sort=prsela,exeela,fchela  (格式化命令)

                SQL> set autot off

                SQL> alter session set statistics_level=typical;

                Session altered.

                SQL> alter session set events '10046 trace name context forever,level 12';

                Session altered.

                SQL> select count(*) from test;

                  COUNT(*) 

                ----------

                         7

                SQL> alter session set events '10046 trace name context off';

                Session altered.

                SQL> select d.value

                

                  2  || '/'

                

                  3  || LOWER (RTRIM(i.INSTANCE, CHR(0)))

                

                  4  || '_ora_'

                

                  5  || p.spid

                

                  6  || '.trc' trace_file_name

                

                  7  from (select p.spid

                

                  8        from v$mystat m,v$session s, v$process p

                

                  9        where  m.statistiC#=1 and s.sid=m.sid and p.addr=s.paddr) p,

                

                 10        (select t.INSTANCE

                

                 11         FROM v$thread t,v$parameter v

                

                 12         WHERE v.name='thread'

                

                 13         AND(v.VALUE=0 OR t.thread#=to_number(v.value))) i,

                

                 14         (select value

                

                 15         from v$parameter

                

                 16         where name='user_dump_dest') d;

                TRACE_FILE_NAME

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

                

                /u01/app/oracle/diag/rdbms/ora12c/ora12c/trace/ora12c_ora_12195.trc

                SQL> host

                [oracle@ora12c ~]$ tkprof /u01/app/oracle/diag/rdbms/ora12c/ora12c/trace/ora12c_ora_12195.trc /home/oracle/10046.txt sys=no sort=prsela,exeela,fchela

                TKPROF: Release 12.1.0.1.0 - Development on Fri Jan 20 08:22:25 2017

                Copyright (c) 1982, 2013, Oracle and/or its affiliates.  All rights reserved.

                SQL ID: 7b2twsn8vgfsc Plan Hash: 784602781

                select count(*)   from test

                call     count       cpu    elapsed       disk      query    current        rows

                

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

                

                Parse        1      0.00       0.00          3          3          2           0

                

                Execute      1      0.00       0.00          0          0          0           0

                

                Fetch        2      0.00       0.00          4         66          0           1

                

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

                

                total        4      0.00       0.00          7         69          2           1

                Misses in library cache during parse: 1

                

                Optimizer mode: ALL_ROWS

                

                Parsing user id: 103  

                

                Number of plan statistics captured: 1

                Rows (1st) Rows (avg) Rows (max)  Row Source Operation

                

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

                

                         1          1          1  SORT AGGREGATE (cr=66 pr=4 pw=0 time=298 us)

                

                         7          7          7   PARTITION RANGE ALL PARTITION: 1 3 (cr=66 pr=4 pw=0 time=397 us cost=39 size=0 card=11)

                

                         7          7          7    TABLE ACCESS FULL TEST PARTITION: 1 3 (cr=66 pr=4 pw=0 time=290 us cost=39 size=0 card=11)

                Elapsed times include waiting on following events:

                

                  Event waited on                             Times   Max. Wait  Total Waited

                

                  ----------------------------------------   Waited  ----------  ------------

                

                  db file sequential read                         4        0.00          0.00

                

                  SQL*Net message to client                       2        0.00          0.00

                

                  db file scattered read                          1        0.00          0.00

                

                  SQL*Net message from client                     2        7.03          7.03

            2.优缺点

                优点:

                    1> 可以看出SQL语句对应的等待事件

                    2> 如果SQL语句中有函数,SQL中有SQL,将会都被列出,无处遁形

                    3> 可以方便的看出处理的行数,逻辑物理读

                    4> 可以跟踪整个程序包

                缺点:    

                    1> 步骤繁琐,比较麻烦

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

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

方法七、awrsqlrpt.sql

            1.执行步骤  

               Step1:@?/rdbms/admin/awrsqrpt.sql

                Step2:选择你要的断点(begin snap 和end snap)

                Step3:输入sql_id

适用场合分析

    1.如果某SQL执行非常长时间才会出结果,甚至慢到返回不了结果,这时候看执行计划就只能用方法explain plan for;

    2.跟踪某条SQL最简单的方法是方法explain plan for ,其次就是方法autotrace;

    3.如果想观察到某条SQL有多条执行计划的情况,只能用方法dbms_xplan.display_cursor(sql_id)和方法awrsqlrpt.sql;

    4.如果SQL中含有多函数,函数中套有SQL等多层递归调用,想准确分析,只能使用方法10046 trace;

    5.要想确保看到真实的执行计划,不能用方法plsql developer和方法explain plan for;

    6.要想获取表被访问的次数,只能使用方法statistics_level();

感谢你能够认真阅读完这篇文章,希望小编分享的“Oracle中如何查看执行计划”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网数据库频道,更多相关知识等着你来学习!

您可能感兴趣的文档:

--结束END--

本文标题: Oracle中如何查看执行计划

本文链接: https://www.lsjlt.com/news/63752.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Oracle中如何查看执行计划
    这篇文章主要介绍了Oracle中如何查看执行计划,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。方法一、通过使用工具PLSQL Develop...
    99+
    2024-04-02
  • oracle中怎么查看执行计划
    在Oracle中查看执行计划可以通过以下两种方法: 1、使用EXPLAIN PLAN语句来生成执行计划: EXPLAIN PLAN ...
    99+
    2024-03-13
    oracle
  • PostgreSQL中如何查看执行计划
    在 PostgreSQL 中,可以使用 EXPLAIN 命令来查看查询语句的执行计划。执行计划显示了 PostgreSQL 优化器将...
    99+
    2024-04-09
    PostgreSQL
  • oracle查看执行计划之DBMS_XPLAN
        使用DBMS_XPLAN包中的方法是在oracle数据库中得到目标SQL的执行计划的另一种方法。针对不同的应用场景吗,你可以选择如下四种方法中的一种:  &n...
    99+
    2024-04-02
  • Oracle怎么查看执行计划
    在Oracle数据库中,可以使用以下两种方法来查看执行计划: 1、使用EXPLAIN PLAN语句:您可以在SQL查询前添加”EXP...
    99+
    2024-04-09
    Oracle
  • oracle中如何查看SQL的执行计划方法
    这篇文章主要介绍了oracle中如何查看SQL的执行计划方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Oracle查看SQL执行计划的方...
    99+
    2024-04-02
  • plsql的执行计划如何查看
    在PL/SQL中,可以使用以下方法来查看执行计划: 使用DBMS_XPLAN包:这是Oracle提供的一个包,可以用于显示SQL语...
    99+
    2024-04-09
    plsql
  • db2如何查看sql执行计划
    在DB2中,您可以使用以下方法查看SQL执行计划: 1、使用EXPLAIN命令:在运行您的SQL查询之前,可以在查询前添加EXPLA...
    99+
    2024-04-12
    db2 sql
  • oracle中怎么查看sql执行计划的执行顺序
    这篇文章主要讲解了“oracle中怎么查看sql执行计划的执行顺序”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“oracle中怎么查看sql执行计划的执行顺...
    99+
    2024-04-02
  • 看懂Oracle中的执行计划
       从事Oracle相关的工作,从最初的一脸懵逼到现在的略有所知,也来总结一下自己最近学习关于Oracle中SQL语句的执行计划的相关内容。下面是文章的目录结构: ...
    99+
    2024-04-02
  • Oracle 11g 查看执行计划10046事件
    使用10046事件查看真实的执行计划操作如下:SQL> conn / as sysdbaConnected.SQL> SQL> oradebug setmypid Stateme...
    99+
    2024-04-02
  • 如何使用dbms_xplan查看执行计划
    小编给大家分享一下如何使用dbms_xplan查看执行计划,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!概述 dbms_xpl...
    99+
    2024-04-02
  • MySQL 5.7如何查看SQL执行计划
    这篇文章将为大家详细讲解有关MySQL 5.7如何查看SQL执行计划,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 可以使用EXPLAIN语句...
    99+
    2024-04-02
  • postgres explain如何查看sql执行计划
    这篇文章主要为大家展示了“postgres explain如何查看sql执行计划”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“postgres explain如...
    99+
    2024-04-02
  • Oracle中怎么查看执行计划的命令
    今天就跟大家聊聊有关Oracle中怎么查看执行计划的命令,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。在SQL*PLUS(PL/SQL的命令窗口和S...
    99+
    2024-04-02
  • oracle中查看执行计划的常用方法
    本篇内容介绍了“oracle中查看执行计划的常用方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!本文介绍...
    99+
    2024-04-02
  • Oracle查询执行计划
    执行计划(Execution Plan)也叫查询计划(Query Plan),它是数据库执行SQL语句的具体步骤和过程。SQL查询语句的执行计划主要包括: ● 访问表的方式。数据库通过索引或全表扫描等方式访问表中的数据。...
    99+
    2023-04-03
    Oracle查询执行计划 Oracle执行计划查询
  • mysql中怎么查看执行计划
    这篇文章将为大家详细讲解有关mysql中怎么查看执行计划,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。explain执行计划包含的信息其中最重要的字段为:i...
    99+
    2024-04-02
  • explain中怎么查看执行计划
    explain中怎么查看执行计划,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。explain内容查看user全表查询的执行计划:mysql...
    99+
    2024-04-02
  • plsql执行计划如何看
    在PL/SQL中,可以使用DBMS_XPLAN包的功能来查看SQL语句的执行计划。以下是一些常用的方法:1. 使用EXPLAIN P...
    99+
    2023-10-10
    plsql
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作