• oracle 执行计划的获取方法


    1.用explain plan for来获取执行计划

    explain plan for <sql>;
    
    select * from table(dbms_xplan.display());

    结果如下:

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

    优点

    1. 不需要真实执行sql,方便快捷

    缺点

    1. 这里的执行计划并不是真实的执行计划
    2. 不能获取运行时的相关统计信息(产生多少逻辑读,多少次递归调用,多少次物理读的情况)
    3. 无法判断表被访问了多少次
    4. 无法判断处理了多少行数据

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

    2.用autotrace 来获取执行计划

    SET AUTOTRACE OFF  --此为默认值,即关闭Autotrace 
    
    SET AUTOTRACE ON EXPLAIN  --只显示执行计划和执行结果
    
    SET AUTOTRACE ON STATISTICS  --只显示执行的统计信息和执行结果
    
    SET AUTOTRACE ON  --包含执行计划,统计信息和执行结果
    
    SET AUTOTRACE TRACEONLY  --只显示执行计划
    使用 SET AUTOTRACE ON EXPLAIN 时,显示执行结果,和执行计划,如图:

    使用 SET AUTOTRACE ON STATISTICS 时,显示执行结果,和统计信息,如图:

    使用 SET AUTOTRACE ON 时,显示执行结果,执行计划和统计信息,如图:

    使用 SET AUTOTRACE TRACEONLY 时,显示执行计划和统计信息如图:

    ---------------------------------------------------------------------------------------------------------------------
    优点

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

    缺点

    1. 获取的不是真实的执行计划
    2. 无法看到表被访问了多少次。

    ---------------------------------------------------------------------------------------------------------------------
    3.使用 gather_plan_statistics 获取高级执行计划

    --方法1
    alter session set statistics_level=all ;
    
    sql;
    
    select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));
    
    --方法2
    sql;(sql中加 HINT (gather_plan_statistics))
    
    select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));

     如图:

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

    优点

    1. 真实的执行计划
    2. 能看到表被扫描的次数
    3. 能看到oracle预测行数和真实返回的行数
    4. 可以看到逻辑读数

    缺点

    1. 必须等sql真实执行过才能看到执行计划
    2. 没有统计信息

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

    4.使用10046事件来获取执行计划

    alter session set events '10046 trace name context  forever,level 12';
    
    SELECT *  FROM t1, t2 WHERE t1.id = t2.t1_id   AND t1.n IN (18, 19);
    
    alter session set events '10046 trace name context off';  
    
    select d.value
    || '/'
    || LOWER (RTRIM(i.INSTANCE, CHR(0)))
    || '_ora_'
    || p.spid
    || '.trc' trace_file_name
    from (select p.spid
          from v$mystat m,v$session s, v$process p
          where  m.statistic#=1 and s.sid=m.sid and p.addr=s.paddr) p,
          (select t.INSTANCE
           FROM v$thread t,v$parameter v
           WHERE v.name='thread'
           AND(v.VALUE=0 OR t.thread#=to_number(v.value))) i,
           (select value
           from v$parameter
           where name='user_dump_dest') d;
           
    exit
    
    tkprof 源trc文件路径 格式化后路径 格式化参数
  • 相关阅读:
    回溯法---哈密顿回路(5)
    回溯法---n皇后问题(4)
    回溯法---n-着色问题(3)
    回溯法--算法框架(2)
    创建二叉树的所有深度上的节点链表
    笔试
    笔试 (2)
    LeetCode278-第一个错误的版本(二分查找)
    LeetCode46-全排列(递归)
    LeetCode258-各位相加(猜想公式)
  • 原文地址:https://www.cnblogs.com/wolil/p/5580141.html
Copyright © 2020-2023  润新知