【问题标题】:Oracle query execution timeOracle查询执行时间
【发布时间】:2011-04-03 07:37:52
【问题描述】:

我想在 Oracle 中获取查询执行时间。我不想要 Oracle 需要打印结果的时间 - 只是执行时间。

在 MySQL 中,很容易从 shell 获取执行时间。

如何在 SQL*Plus 中做到这一点?

【问题讨论】:

    标签: oracle sqlplus execution


    【解决方案1】:

    人们可以发出 SQL*Plus 命令SET TIMING ON 来获取挂钟时间,但不能从中获取时间。

    AUTOTRACE 设置,当用作SET AUTOTRACE TRACEONLY 时将抑制输出,但仍会执行所有工作以满足查询并将结果发送回 SQL*Plus,SQL*Plus 将抑制它。

    最后,可以跟踪 SQL*Plus 会话,并手动计算等待客户端等待事件所花费的时间,例如“到客户端的 SQL*Net 消息”、“来自客户端的 SQL*Net 消息”。

    【讨论】:

      【解决方案2】:

      用途:

      set serveroutput on
      variable n number
      exec :n := dbms_utility.get_time;
      select ......
      exec dbms_output.put_line( (dbms_utility.get_time-:n)/100) || ' seconds....' );
      

      或者可能:

      SET TIMING ON;
      
      -- do stuff
      
      SET TIMING OFF;
      

      ...获取经过的百分之一秒。

      在任何一种情况下,经过的时间都会受到服务器负载/等的影响。

      参考:

      【讨论】:

      • 您好,感谢您的回答。我只想注意我在第一个解决方案中遇到的问题。如果选择持续时间少于 1 秒。我收到了。像例如“.65 秒....”。固定行看起来像 exec dbms_output.put_line(TO_CHAR(( DBMS_UTILITY.GET_TIME - :n ) / 100, 'FM999990.00') || ' seconds....' );,结果开头为零;)干杯!
      【解决方案3】:

      我建议将一致的获取/逻辑读取视为比运行时更好的“工作”代理。运行时间可能会受到数据库服务器上发生的其他事情、缓存中有多少内容等因素的影响。

      但如果您真的想要 SQL 执行时间,V$SQL 视图同时具有 CPU_TIME 和 ELAPSED_TIME。

      【讨论】:

      • 另外,因为 SQL 可以共享,您还需要查看执行次数并将其除以计算平均值,否则您将找到所有执行的 ELAPSED_TIME,并且可能会让您想知道为什么简单1 秒 SQL 消耗了数小时的经过时间。
      【解决方案4】:
      select LAST_LOAD_TIME, ELAPSED_TIME, MODULE, SQL_TEXT elapsed from v$sql
        order by LAST_LOAD_TIME desc
      

      更复杂的例子(不要忘记删除或替换PATTERN):

      select * from (
        select LAST_LOAD_TIME, to_char(ELAPSED_TIME/1000, '999,999,999.000') || ' ms' as TIME,
               MODULE, SQL_TEXT from SYS."V_\$SQL"
          where SQL_TEXT like '%PATTERN%'
          order by LAST_LOAD_TIME desc
        ) where ROWNUM <= 5;
      

      【讨论】:

      • 这个方法看起来很有效。您能否详细解释一下初始运行和后续运行对经过时间的影响?似乎(至少在 Oracle 19c 中)经过的时间是累积的,每次运行相同/相似的查询(或使用相同的缓存解析语句?)只占用初始时间的一小部分。
      • 非常有用,谢谢。建议:将SQL_IDPLAN_HASH_VALUE列在要选择的列中,并将时间除以1,000,000,得到秒。 to_char(ELAPSED_TIME/1000000, '999,999,999.000') || ' s'
      【解决方案5】:
      set timing on
      spool /home/sss/somefile.txt
      set termout off
      select ...
      set termout on
      set timing off
      spool off
      

      将其保存到script.sql,然后在终端中执行此操作:

      sqlcl user@host/dbname @/path/to/your/script.sql
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-05
        • 1970-01-01
        • 1970-01-01
        • 2012-07-30
        • 2016-01-13
        • 2011-07-19
        • 1970-01-01
        • 2016-11-10
        相关资源
        最近更新 更多