Oracle SQL TO_DATE和TO_TIMESTAMP

时间:2017-07-13 03:18:43

标签: oracle datetime

我在Oracle SQL中有两个等价的查询。

echo strlen('<td bgcolor=#FFFFFF>2-0</td>'); // 28
echo strlen(htmlentities('<td bgcolor=#FFFFFF>2-0</td>')); // 40

SELECT ... FROM TABLE WHERE timestamp = TO_DATE('2017-07-01', 'YYYY-MM-DD')

通常,我需要每天运行(自动化),因此第一个查询就足够了。但是,对于前几次运行,我需要一些自定义日期时间边界,因此我可能会手动干预并使用第二个查询。

我观察到的是第一个跑得更快。引擎盖下,这是真的吗?性能差异是否足够显着?有人可以解释一下吗?

1 个答案:

答案 0 :(得分:1)

魔鬼在细节中。

1)表中有多少条记录?

2)满足多少记录

timestamp = TO_DATE('2017-07-01', 'YYYY-MM-DD')

3)满足多少记录

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')

4)表中是否收集了统计数据? timestamp列是否有直方图统计信息?

5)您在timestamp列上有索引吗?或者它可能是(子)按时间戳划分?

为表和索引发送DDL可能更容易 - 这将非常有用。

假设您已将timestamp列编入索引,对于第一个查询,您将查找一个值,在另一种情况下,它是一个值范围。因此,根据统计数据和许多其他因素(如上所述),Oracle可以选择切换到全表扫描,例如,如果它认为第二个谓词返回的行数要多得多,那么直接读取表的成本会更低。

我知道问题可能比答案更多,但Oracle数据库非常灵活,灵活性也很复杂。希望上面的一些信息会有所帮助。

此外,一个简单的解释计划,sqlplus autrotrace或最佳情况10053 trace或10046跟踪可以显示更明确的答案是什么在那里。