我想在Oracle中获取查询执行时间。我不希望Oracle需要时间打印结果 - 只是执行时间。
在MySQL中,很容易从shell获得执行时间。
如何在 SQL * Plus 中执行此操作?
答案 0 :(得分:24)
可以发出SQL * Plus命令SET TIMING ON
来获取挂钟时间,但是,例如,可以从中轻松获取时间。
AUTOTRACE设置用作SET AUTOTRACE TRACEONLY
时会抑制输出,但仍会执行所有工作以满足查询要求并将结果发送回SQL * Plus,这会抑制它。
最后,可以跟踪SQL * Plus会话,并手动计算等待客户端等待事件所花费的时间,例如“SQL * Net message to client”,“SQL * Net message from client”。
答案 1 :(得分:17)
使用:
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;
...获得经过的百分之几秒。
在任何一种情况下,服务器负载等都会影响已用时间。
参考:
答案 2 :(得分:6)
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;
答案 3 :(得分:3)
我建议将一致的获取/逻辑读取视为“工作”的更好代理而不是运行时间。运行时间可能会因数据库服务器上发生的其他事情,缓存中有多少内容等而有所不同。
但是如果您真的想要SQL执行时间,那么V $ SQL视图同时具有CPU_TIME和ELAPSED_TIME。