【发布时间】:2011-04-03 07:37:52
【问题描述】:
我想在 Oracle 中获取查询执行时间。我不想要 Oracle 需要打印结果的时间 - 只是执行时间。
在 MySQL 中,很容易从 shell 获取执行时间。
如何在 SQL*Plus 中做到这一点?
【问题讨论】:
我想在 Oracle 中获取查询执行时间。我不想要 Oracle 需要打印结果的时间 - 只是执行时间。
在 MySQL 中,很容易从 shell 获取执行时间。
如何在 SQL*Plus 中做到这一点?
【问题讨论】:
人们可以发出 SQL*Plus 命令SET TIMING ON 来获取挂钟时间,但不能从中获取时间。
AUTOTRACE 设置,当用作SET AUTOTRACE TRACEONLY 时将抑制输出,但仍会执行所有工作以满足查询并将结果发送回 SQL*Plus,SQL*Plus 将抑制它。
最后,可以跟踪 SQL*Plus 会话,并手动计算等待客户端等待事件所花费的时间,例如“到客户端的 SQL*Net 消息”、“来自客户端的 SQL*Net 消息”。
【讨论】:
用途:
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;
...获取经过的百分之一秒。
在任何一种情况下,经过的时间都会受到服务器负载/等的影响。
参考:
【讨论】:
exec dbms_output.put_line(TO_CHAR(( DBMS_UTILITY.GET_TIME - :n ) / 100, 'FM999990.00') || ' seconds....' );,结果开头为零;)干杯!
我建议将一致的获取/逻辑读取视为比运行时更好的“工作”代理。运行时间可能会受到数据库服务器上发生的其他事情、缓存中有多少内容等因素的影响。
但如果您真的想要 SQL 执行时间,V$SQL 视图同时具有 CPU_TIME 和 ELAPSED_TIME。
【讨论】:
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;
【讨论】:
SQL_ID和PLAN_HASH_VALUE列在要选择的列中,并将时间除以1,000,000,得到秒。 to_char(ELAPSED_TIME/1000000, '999,999,999.000') || ' s'
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
【讨论】: