gpt4 book ai didi

sql - 为什么在 Oracle 中使用子选择的查询成本低于使用常量的查询

转载 作者:行者123 更新时间:2023-12-04 14:45:30 24 4
gpt4 key购买 nike

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

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

  • select count(*) from fman_file

    where dateadded >= (select sysdate - 60 from dual)
    费用:65
  • select count(*) from fman_file

    where dateadded >= sysdate - 60
    成本:1909
  • select count(*) from fman_file

    where dateadded >= sysdate - numtodsinterval(60,'day')
    成本:1884
  • select count(*) from fman_file where dateadded >= '10.10.2009'成本:1823
    (10.10.2009 只是一个示例日期!!!)

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

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

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

    格雷茨

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

    最佳答案

    在乔纳森·刘易斯 (Jonathan Lewis) 所著的“基于成本的 Oracle 基础知识”的第 6 章“令人惊讶的系统日期”中找到了一些提示。这似乎适用于 9i,可能也适用于更高版本。

    The optimizer treats sysdate (and trunc(sysdate) and a few other functions of sysdate) as known constants at parse time, but sysdate + N becomes an unknown, and gets the same treatment as a bind variable - which means a fixed 5% selectivity. (Note in particular that sysdate + 0 will give a different cardinality from sysdate.)



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

    关于sql - 为什么在 Oracle 中使用子选择的查询成本低于使用常量的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3195677/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com