6

我有一个包含数百万条目的 SQL 表,我试图查询有多少条目超过 60 天(Oracle 11.2.0.1.0)。

对于这个实验,我使用了 3 个不同版本的选择语句:(
成本值由 TOAD 为 Oracle V. 9.7.2.5 提供)

  1. select count(*) from fman_file
    where dateadded >= (select sysdate - 60 from dual)

    费用:65

  2. select count(*) from fman_file
    where dateadded >= sysdate - 60

    成本:1909

  3. select count(*) from fman_file
    where dateadded >= sysdate - numtodsinterval(60,'day')

    成本:1884

  4. select count(*) from fman_file where dateadded >= '10.10.2009'
    成本:1823
    (10.10.2009 只是一个示例日期!!!)

我没有想到所有查询的准确时间值,但第一个确实是最快的。

所以我用其他子选择尝试了更多的选择查询(比如(从双重选择 1000)),它们(有时 WAY)比其他具有常量值的查询快。甚至似乎这个“WHATEVER”(错误/功能)也在 MySQL 中发生。

那么谁能告诉我为什么第一个查询比其他查询(方式)更快?

格雷茨

PS:这与sydate无关!问题是为什么(选择)的变化比其他的快?(稍微关注 Select-Variation(1.) 与 Constant-Variation (4.))

4

5 回答 5

3

在我的 Jonathan Lewis 第 6 章“令人惊讶的 sysdate”中的“基于成本的 Oracle 基础知识”副本中找到了一些提示。这似乎适用于 9i,也可能适用于更高版本。

优化器在解析时将 sysdate(以及 trunc(sysdate) 和一些其他函数)视为已知常量,但 sysdate + N 变为未知数,并得到与绑定变量相同的处理 - 这意味着固定的 5% 选择性. (特别注意 sysdate + 0 将给出与 sysdate 不同的基数。)

显然,优化器也将 识别select sysdate from dual为已知常数。

于 2010-07-07T15:33:43.703 回答
1

汤姆凯特

dual 的优点是优化器理解 dual 是一个特殊的单行一列表——当您在查询中使用它时,它会在开发计划时使用此知识。

于 2010-07-07T14:41:06.673 回答
0

您可以尝试使用Explain Plan. 这将向您展示查询正在做什么以及它们之间的差异。

设置和使用解释计划的几个链接:

http://download.oracle.com/docs/cd/B10500_01/server.920/a96533/ex_plan.htm

http://www.adp-gmbh.ch/ora/explainplan.html

于 2010-07-07T14:48:03.820 回答
0

您是否在 >= 之后在计算周围使用 () 重新尝试了数字 2-4 - 在我看来,第一个语句是唯一一个计算该值的语句 - 对于所有其他语句,它会在每一行上重新计算。例如:

select count(*) from fman_file where dateadded >= (SELECT sysdate - 60) 

select count(*) from fman_file where dateadded >= (SELECT (sysdate - numtodsinterval(60,'day'))

select count(*) from fman_file where dateadded >= (SELECT CONVERT(datetime,'10.10.2009')) 

注意——不知道在 Oracle 中转换为日期时间的语法——但你明白了。

于 2010-07-07T14:36:11.033 回答
0

而不是使用(select sysdate - 60 from dual)我宁愿建议您使用绑定变量,该值是在执行查询之前计算的

于 2014-02-14T06:47:39.773 回答