【问题标题】:how to time an oracle select query如何为 Oracle 选择查询计时
【发布时间】:2010-11-17 16:24:24
【问题描述】:

找出 oracle select 语句需要多长时间的最佳方法是什么。我有以下查询,我想找出时间,但是,由于此查询带来了四千条记录,并且在屏幕上显示这四千条记录需要时间,因此所述经过的时间可能不正确。

有没有办法可以将它包装到游标中,然后从 sql plus 运行它,以便我得到执行它所需的正确时间?

SELECT a.code, NVL(a.org, ' '), NVL(a.office_number, ' '), SUBSTR(a.code, 0, 2) 
FROM PARTICIPANT a WHERE a.type_code = 'PRIME';

【问题讨论】:

  • 您目前如何获得“规定的经过时间”?
  • 我只是在运行查询之前通过 set timing on 在 sqlplus 上运行它。这会在屏幕上绘制记录,然后给我一个经过的时间。我觉得屏幕上的记录画也被当成经过时间了

标签: oracle plsql


【解决方案1】:

在 SQL*Plus 中,您还可以使用简单的 TIMING 选项:

SQL> SET TIMING ON
SQL> SELECT bla FROM bla...
...
Elapsed: 00:00:00:01
SQL> SELECT bar FROM foo...
...
Elapsed: 00:00:23:41
SQL> SET TIMING OFF

这将分别报告每个语句的时间信息。

另一种选择是设置单独的计时器:

SQL> TIMING START mytimer
SQL> ... run all my scripts ...
SQL> TIMING STOP
timinig for: mytimer
Elapsed: 00:00:08.32

您甚至可以嵌套这些单独的计时器 - TIMING STOP 将最近的计时器从堆栈中弹出。

【讨论】:

  • 哎呀,抱歉,我没有看到您已经在这样做的评论。哦,好吧,这个答案可能对其他人有帮助。
【解决方案2】:

我可以想到几种方法。

我通常通过将其运行到带有CREATE TABLE AS SELECT.... 的表中来执行此类操作,这意味着我经常在我的架构中乱扔许多名为MIKE_TEMP_1 的表。

其他选项是在 SQL*Plus 中使用 SET AUTOTRACE TRACEONLY,它应该运行所有查询但禁止打印结果。

【讨论】:

  • 请注意,执行 CREATE TABLE AS SELECT 会定期生成与基础 SELECT 语句的计划不同的查询计划。所以这并不总是一个特别好的测试。 +1 为 SET AUTOTRACE TRACEONLY 选项。
  • 是的。自动跟踪 traceonly 获胜
  • @justin 我做数据仓库工作,所以 CTAS 计划通常是我想要的。但我确实接受你的观点。
  • CTAS 会有额外的物理写入成本/时间。我会选择 TRACEONLY 选项。
【解决方案3】:

想到的选项:

a) 使用外部选择,如果优化器破坏它可能不完全准确,但可以提供一个好主意:

SELECT COUNT(*) from (
    SELECT a.code, NVL(a.org, ' '), NVL(a.office_number, ' '), SUBSTR(a.code, 0, 2) 
    FROM PARTICIPANT a WHERE a.type_code = 'PRIME'
);

b) 将其放入脚本中,从命令行运行并将输出重定向到文件。

c)打开阀芯并关闭(不确定)。

d) set autotrace traceonly(@MikeyByCrikey 打败了我)。

【讨论】:

  • 是的,(c) 有效。当然,SQL Plus 假脱机到文件需要一些有限的时间,但它并不像输出到屏幕那么重要。
【解决方案4】:

您可以转到具有以下列的 V$SQL:

APPLICATION_WAIT_TIME
CONCURRENCY_WAIT_TIME
CLUSTER_WAIT_TIME
USER_IO_WAIT_TIME
PLSQL_EXEC_TIME
CPU_TIME
ELAPSED_TIME

但它们是该 SQL 的所有执行的聚合。如果没有其他人在运行 SQL,您可以做一个之前/之后的快照并计算出差异。

【讨论】:

    【解决方案5】:

    只是不显示查询结果

    SET TERMOUT OFF
    

    【讨论】:

      猜你喜欢
      • 2021-09-27
      • 2021-10-15
      • 2013-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-09
      • 2013-01-19
      相关资源
      最近更新 更多