【发布时间】:2017-07-13 03:18:42
【问题描述】:
我在 Oracle SQL 中有两个等效的查询。
SELECT ... FROM TABLE WHERE timestamp = TO_DATE('2017-07-01', 'YYYY-MM-DD')
和
SELECT ... FROM TABLE WHERE
timestamp >= TO_TIMESTAMP('2017-07-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS') AND
timestamp < TO_TIMESTAMP('2017-07-02 00:00:00', 'YYYY-MM-DD HH24:MI:SS')
一般来说,我需要每天(自动)运行它,这样第一个查询就足以满足应用程序的需求。但是,对于前几次运行,我需要一些自定义日期时间边界,因此我可能会手动干预并改用第二个查询。
我观察到的是第一个跑得更快。在引擎盖下,真的是这样吗?性能差异是否足够显着?谁能解释一下?
【问题讨论】:
-
pl/sql 是一种过程语言(不同于 SQL),它与您的问题无关。
-
这两个查询不等价。即使第二个查询可能检索到数千行,第一个查询也可能检索到很少的行(可能没有!)。您是否暗示在您的数据中时间戳始终具有等于 00:00:00 的时间部分,这使得两个查询等效? 您可能知道这一点,但 Oracle 不读取值就无法知道它,因此即使这样,第一个查询也会比第二个查询快也就不足为奇了。是的,实际上这两个查询并不相同。
-
另外,在第一个查询中,为什么要将时间戳与日期而不是时间戳进行比较?然后:为避免不必要的函数调用,您可以使用时间戳文字语法:
... timestamp_column = (or >= etc.) timestamp '2017-07-01 00:00:00'。 -
@mathguy 是的,时间戳列的格式为
2017-07-01 00:00:00.0 -
@menorah84,没有时间戳列没有格式。问题是,数据包含什么?所有记录上的时间是否都设置为精确的
00:00:00.000000?