我在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')
通常,我需要每天运行(自动化),因此第一个查询就足够了。但是,对于前几次运行,我需要一些自定义日期时间边界,因此我可能会手动干预并使用第二个查询。
我观察到的是第一个跑得更快。引擎盖下,这是真的吗?性能差异是否足够显着?有人可以解释一下吗?
答案 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跟踪可以显示更明确的答案是什么在那里。