0

我必须对查询进行基准测试 - 目前我需要知道添加参数以选择结果集(FIELD_DATE1)将如何影响 sql 执行时间。db 中有管理限制,所以我不能使用调试。所以我写了一个查询:

SELECT COUNT(*), MIN(XXXT), MAX(XXXT) 
  FROM ( select distinct ID AS XXXID, sys_extract_utc(systimestamp) AS XXXT
              , FIELD_DATE1 AS XXXUT  
           from XXXTABLE 
          where FIELD_DATE1 > '20-AUG-06 02.23.40.010000000 PM' );

查询的输出将显示查询执行的实时时间

4

2 回答 2

3

在 Oracle 中进行基准测试时需要学习很多东西。我建议您从以下项目开始,即使它担心您在 db 中可能没有足够的限制,因为其中一些功能可能需要额外的权限:

  • 解释计划:对于每条 SQL 语句,oracle 必须创建一个执行计划,执行计划定义了如何读取/写入信息。即:要使用的索引、连接方法、排序等。解释计划将为您提供有关您的查询有多好以及它如何使用索引的信息。学习这个查询成本的概念是关键,所以看看它。

  • TKPROF:它是一个Oracle 工具,允许您读取Oracle 跟踪文件。当您在 oracle 中启用定时统计时,您可以跟踪您的 sql 语句,此跟踪的结果将放在文件中;您可以使用 TKPROF 读取这些文件。TKPROF 将让您看到的信息包括:

  • count = 执行 OCI 程序的次数
  • cpu = cpu 执行时间,以秒为单位
  • elapsed = 执行的经过时间(以秒为单位)
  • disk = 从磁盘中物理读取缓冲区的次数
  • 查询 = 为一致读取而获得的缓冲区数
  • current = 在当前模式下获得的缓冲区数(通常用于更新)
  • rows = fetch 或 execute 调用处理的行数

请参阅:使用 SQL 跟踪和 TKPROF

于 2012-08-21T14:13:04.283 回答
2

在这个查询中SYSTIMESTAMP可能会被评估一次,并且与每一行关联的相同值,或者它会为每一行评估一次,或者介于两者之间。也有可能从表中获取所有行,然后为每一行评估 SYSTIMESTAMP,因此您无法准确了解整个查询所花费的时间。通常,您不能依赖 SQL 中的求值顺序,或者假设函数将针对它出现的每一行求值一次。

一般来说,我测量执行时间的方法是使用客户端工具来报告它。如果您在 SQLPlus 中执行查询,您可以SET TIMING ON让它报告每个语句的执行时间。其他交互式工具可能具有类似的功能。

于 2012-08-21T14:12:42.130 回答