【问题标题】:Execution time for sql files - batch operationsql文件的执行时间——批量操作
【发布时间】:2014-03-20 08:40:46
【问题描述】:

我有一堆 SQL 查询作为文件存储在磁盘上。
它们都是纯SELECT 查询,或者换句话说,它们只做读操作。

我正在连接到 Oracle 11g 数据库,我想测量所有这些查询的大致执行时间。有没有办法以编程方式做到这一点?

数据库位于防火墙后面的服务器上,因此我只能通过 Toad 或 Oracle SQL 开发人员连接到数据库。因此,在这里编写我自己的 java/python 代码不是一种选择。

【问题讨论】:

  • 如果您可以连接 SQL Developer 和 Toad,那么您可以连接其他任何东西。
  • 根据您运行文件的方式,您不能只在 SQL Developer 工作表中 set timing on 吗?
  • @Mat:不完全是我的情况。 Toad 和 SQL 开发人员在防火墙内的机器上,我远程进入它。但是,我无法访问命令提示符、任务管理器和这台中间机器上的一大堆东西。
  • 廉价技巧:在前后打印 sysdate :) 如果没有,则通过 cron 或 scheudler 运行脚本,这将为您提供总运行时间的值
  • @realspirituals:你能再描述一下吗?

标签: sql oracle oracle11g


【解决方案1】:

在使用 TOAD 时,我可以想到几个选项。

选项 1: 这应该可以在 TOAD 中按 F5

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: 这应该在 TOAD 中按 F5 工作,但这不会打印查询结果。

SET AUTOTRACE TRACEONLY
YOUR QUERY

选项 3: 这应该可以在 TOAD 中按 F5

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

【讨论】:

  • 总是关闭 Database_Output,因为将输出写入屏幕是很慢的 - 你会被 TOAD 和 SQLDev 的优化所欺骗,因为它们只获取查询的前几行,直到你向下滚动 -仅使用自动跟踪,您可以获得数据库所需的时间
  • 选择和返回时间将小于检索所有行,因为它是实际写入时间。所以这取决于用户来决定
  • @Falco:如何关闭输出显示?我正在使用来自 Oracle SQL Developer 的 SQL*Plus 和 set autotrace traceonly exp stat,它告诉我目前不支持 traceonly..
  • @tumchaaditya 我刚刚用 SQL*Plus 对其进行了测试,“set autotrace traceonly”的工作方式与描述的一样......也许你的 SQLPlus 或 DB 版本太旧 - 或者它是你数据库上的配置设置还是在您的用户上?
  • @realspirituals 你是什么意思?即使关闭了输出,SQL*Plus 仍将通过网络接收所有行 - 只需查看跟踪,唯一没有发生的事情是打印到控制台,这很慢并且在实际应用程序中从未完成,因为没有人会读取 1000 万行控制台...
【解决方案2】:

我会在选择之前对日志表执行插入操作,并在每次选择后更新它。

这将使您不仅可以查询今天的时间,还可以查询历史,并检测或回溯执行时间的增加。

表格可以与一个小型网络应用程序相关,以图形方式向您显示数据并趋向于让您的老板满意 :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 可能比仅仅一天更好(尤其是在午夜之前运行时)。

表可以重复用于执行插入、更新等的其他批处理作业...以记录其他信息(处理的行数、受影响的行数等)。

插入/更新也可以集中在一个过程中(在一个包内?)。

【讨论】:

    【解决方案3】:

    如果您想要直截了当的方式,请将所有选择设置在 1 个文件中,添加带有时间戳的 dbms 输出(以毫秒为单位)(或者只是添加一些变量来执行此操作)。或者像其他人说的那样,将时间戳添加到日志表中。

    【讨论】:

      猜你喜欢
      • 2015-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-27
      • 1970-01-01
      • 2011-05-06
      • 1970-01-01
      相关资源
      最近更新 更多