使用 TRUNC 将禁止日期列上的任何常规索引。提高性能的一种方法是创建基于函数的索引。
但是,更好的方法是使用显式范围条件。
例如,
SELECT *
FROM MY_TABLE
WHERE
MY_DATE >= TO_DATE('24-MAR-2015','DD-MON-YYYY')
AND MY_DATE < TO_DATE('24-MAR-2015','DD-MON-YYYY')+1;
或者,
使用 BETWEEN(无论如何都会被优化器重写为上述范围条件):
SELECT *
FROM MY_TABLE
WHERE
MY_DATE BETWEEN TO_DATE('24-MAR-2015','DD-MON-YYYY')
AND TO_DATE('24-MAR-2015','DD-MON-YYYY') + (1-1/24/60/60);
更多信息
使用范围条件,优化器实际上是通过以下方式重写查询:
access("MY_DATE">=TO_DATE(' 2015-03-24 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND
"MY_DATE"<TO_DATE(' 2015-03-24 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))
并且将有一个INDEX RANGE SCAN 操作而不是TABLE ACCESS FULL。在使用 TRUNC 的情况下,没有基于函数的索引,这是优化器应用过滤谓词的方式:
filter(TRUNC(INTERNAL_FUNCTION("MY_DATE"))=TO_DATE(' 2015-03-24 00:00:00',
'syyyy-mm-dd hh24:mi:ss'))
一篇关于Impact of the TRUNC Function on an Indexed Date Column的好文章