其中哪一项更快?还有其他差异吗?
一个。
SELECT
*
FROM
my_table
WHERE
my_date >= DATE '2013-01-17';
乙
SELECT
*
FROM
my_table
WHERE
my_date >= TO_DATE('17/01/2013','dd/mm/yyyy');
答案 0 :(得分:3)
极不可能有意义的不同。如果您的瓶颈是将字符串文字转换为日期的速度有多快,我倾向于宣布胜利并祝酒历史上第一个完美调整的应用程序。或者严重质疑我做错了什么迫使这么多文字需要转换成日期。
理论上,使用日期文字应该更快一点,因为格式是固定的,因此您不必具有首先解析格式掩码然后解析字符串的复杂性。但这假设内部Oracle在编写优化的日期文字路径时感到困扰,而不是在内部通过to_date
代码路径(可能取决于特定的Oracle版本)。并且,就像我说的那样,如果你处于这种差异很重要的位置,你要么做了一些非常错误的事情,要么你已经彻底调整了应用程序,以至于它几乎可以肯定是时候停下来了。
答案 1 :(得分:1)
是的,日期文字更快。 TO_DATE
是一个错误,应该避免。 (它不是总是一个bug,但总是对它持怀疑态度是有帮助的。)
基于Stackoverflow问题,日期处理是Oracle最棘手的部分之一。相信字符串和日期是同样的事情会导致很多问题。了解文字的重要性并始终使用正确的数据类型将间接地提高性能。例如,当开发人员不断将字符串转换为日期时,实体 - 属性 - 值反模式看起来更可疑。
确实,处理日期文字和TO_DATE
的时间可能相同或不相关。无论如何,日期文字内部转换为TO_DATE
也是如此。但是表现还不如说。从编译器和优化器的角度来看,日期文字可以更容易理解代码,从而提高性能。
以下是日期文字可以显着提高效果的两个示例。
减少硬分析
国家语言支持(NLS)使Oracle在使用TO_DATE
时难以精确区分变量和文字。
我们可能会假设我们在美国使用公历编码英语。我们可能经常(不公平地)利用美国编码霸权并假设其他开发人员了解我们的系统。但优化器必须假设最坏的情况并非常仔细地检查日期字符串。
采取这个声明:
select * from dual where trunc(sysdate) = to_date('06-AUG-2014', 'DD-MON-YYYY');
Oracle解析它,然后存储一个SQL_ID,它是整个字符串的哈希值。但是对于日期,如果许多NLS参数中的一个发生变化,则完全相同的语句具有不同的含义。更改NLS参数可能会导致模糊TO_DATE
的硬分析增加。日期文字总是以相同的方式解析。
更好的执行计划
与解析问题类似,当Oracle无法理解谓词的含义时,可能导致执行计划不佳。例如,在this answer中我显示TO_DATE
格式有一个微不足道的变化,可以在静态和动态分区修剪之间产生变化。这种变化会导致更糟糕的统计数据,从而导致执行计划不佳。
<强>摘要强>
始终使用日期文字而不是TO_DATE
。表现通常是一样的。但是在某些情况下日期文字明显更快,间接导致更好的编码实践,更标准化(ISO 8601),可以在编译时检查而不是运行时间,对国际受众不那么模糊,并且更容易类型。
使用日期文字是您可以做出的少数几种编码风格决策之一,它会以各种可能的方式做得更好。