【问题标题】:Oracle Interval 1 dayOracle 间隔 1 天
【发布时间】:2020-02-14 09:39:17
【问题描述】:

我想了解两者的区别

someDate >= (CURRENT_TIMESTAMP - INTERVAL '1' DAY) 

someDate >= (CURRENT_TIMESTAMP - 1)

因为对我来说似乎是一样的,但第二个似乎有更好的性能。

【问题讨论】:

  • 在您的问题中添加详细信息,解释#2“似乎”如何具有更好的性能。我怀疑解析和准备“1天前”的单个值以便使用它在查询中进行过滤所花费的时间将对整体查询性能产生任何明显的影响,除非那时导致数百万行的不必要类型转换
  • @CaiusJard: 可能是因为 #1 返回 timestamp 值而 #2 返回 date 值。如果someDate 也是一个可能影响查询使用索引的日期。但只有查询的执行计划才能证明这一点

标签: sql oracle datetime timestamp intervals


【解决方案1】:

主要区别在于CURRENT_TIMESTAMP - 1 依赖于 Oracle 对 DATE 数据类型执行算术并派生新日期的能力,这是(某些)其他数据库不支持的能力。

CURRENT_TIMESTAMP - INTERVAL '1' DAY 使用区间数据类型来达到相同的目的。这是标准语法并得到广泛支持。

我认为任何一个感知到的性能优势都只是一种错觉,可能是由“暖缓存”效应引起的。

还有一个次要的区别。在第二种情况下使用算术会导致隐式数据转换,并且派生值是 DATE,而使用 INTERVAL 意味着第一个示例的派生值仍然是 TIMESTAMP。

select dump(current_date) as dt
       ,dump(current_timestamp) as ts 
       ,dump(current_timestamp-1) as ts_arith
       ,dump(current_timestamp - interval '1' day) as ts_invl
       ,dump(current_date - interval '1' day) as dt_invl
from dual
/

如果 SOME_DATE 是日期类型并且列已编入索引,这可能会导致性能差异。在这种情况下,与日期进行比较可能会使用索引,而与时间戳进行比较则不会。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    • 2020-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-10
    • 2019-08-21
    相关资源
    最近更新 更多