我有一堆SQL查询存储在磁盘上的文件中
它们都是纯SELECT
个查询,换句话说,它们只进行读操作。
我正在连接到Oracle 11g数据库,我想测量所有这些查询的大致执行时间。有没有办法以编程方式执行此操作?
数据库位于防火墙后面的服务器上,因此我只能通过Toad或Oracle SQL开发人员连接到数据库。因此,编写我自己的java / python代码不是一个选项。
答案 0 :(得分:3)
使用TOAD时我可以想到几个选项。
选项1:按 F5
,这应该在TOAD中有效TURN SPOOL ON -- Spool the results
SET TERMOUT OFF -- Controls the display of output generated by commands executed from a script.
SELECT * FROM TABLE;
SPOOL OFF
选项2:按 F5 ,这应该在TOAD中有效但是这不会打印查询结果。
SET AUTOTRACE TRACEONLY
YOUR QUERY
选项3:按 F5
,这应该在TOAD中有效SET TIMING ON -- Controls the display of timing statistics.
YOUR QUERY
例如选项3
SET TIMING ON
SELECT bla FROM bla...
...
Elapsed: 00:00:00:01
SELECT bar FROM foo...
...
Elapsed: 00:00:23:41
SET TIMING OFF
运行所有脚本并查找总时间
TIMING START allmyscripts
... run all my scripts ...
TIMING STOP
timinig for: allmyscripts
Elapsed: 00:00:08.32
使用V $ SQL
中的以下列查找DBA样式APPLICATION_WAIT_TIME
CONCURRENCY_WAIT_TIME
CLUSTER_WAIT_TIME
USER_IO_WAIT_TIME
PLSQL_EXEC_TIME
CPU_TIME
ELAPSED_TIME
注意:我建议选项3
答案 1 :(得分:2)
我会在选择之前执行对日志记录表的插入,并在每次选择之后更新它。
这不仅可以查询今天的时间,还可以查询历史记录,检测或回溯执行时间的增加。
表可能与一个小型Web应用程序相关,用于向您显示数据并以图形方式呈现,以保证您的老板满意:D
create table batch_log (
batch_name varchar2(100) not null,
run_id varchar2(100) not null,
start_time date not null,
stop_time date not null);
insert into batch_log ('myFisrtSelect',date(sysdate), sysdate, sysdate);
select ....
update batch_log set stop_time=sysdate where batch_name='myFisrtSelect' and run_id=date(sysdate):
当然,run_id可能比一天更好(特别是如果在午夜之前运行)。
表可以重复用于执行插入,更新等的其他批处理作业...以记录其他信息(处理的行数,受影响的行等等。)
插入/更新也可以集中在一个过程中(在包内?)。
答案 2 :(得分:0)
如果你想要直截了当,将所有选择设置在1个文件中,添加带有时间戳的dbms输出(以毫秒为单位)(或者只添加一些变量来实现)。或者像其他人说的那样,将时间戳添加到日志表中。