Sql 除非在内联视图中,否则基于Oracle函数的索引不起作用

Sql 除非在内联视图中,否则基于Oracle函数的索引不起作用,sql,oracle,indexing,Sql,Oracle,Indexing,我们在Oracle 11g 11.2.0.3.0中发现了一个非常奇怪的问题 在transactions表上创建的基于函数的索引只有在内联视图中才能工作。当修改“yyyy-mm-dd”时,索引将声明在\u-char上 第一个查询永远不会结束: SELECT TO_CHAR(tran.whenmodified, 'yyyy-mm-dd') FROM transactions tran WHERE TO_CHAR(tran.whenmodified, 'yyyy-mm-dd') = '2014-05-

我们在Oracle 11g 11.2.0.3.0中发现了一个非常奇怪的问题

在transactions表上创建的基于函数的索引只有在内联视图中才能工作。当修改“yyyy-mm-dd”时,索引将声明在\u-char上

第一个查询永远不会结束:

SELECT TO_CHAR(tran.whenmodified, 'yyyy-mm-dd')
FROM transactions tran
WHERE TO_CHAR(tran.whenmodified, 'yyyy-mm-dd') = '2014-05-09'
    AND rownum < 10;
另一个查询非常有效:

SELECT TO_CHAR(tran.whenmodified, 'yyyy-mm-dd')
FROM (SELECT * FROM transactions ) tran
WHERE TO_CHAR(TRAN.WHENMODIFIED, 'yyyy-mm-dd') = '2014-05-09'
    AND rownum < 10;    
这两种情况下的执行计划完全相同,并且在这两种情况下都使用索引。
有人能想出任何可能导致此问题的原因吗?

与您的问题无关,但您为什么要使用基于函数的索引?将字符串转换为日期并选择on date会更有意义。。。如果不需要基于时间的元素,请在truncwhenmodified上构建索引,并查询truncwhenmodified=date“2014-05-05”的位置。将日期作为日期查询更符合逻辑……我们也考虑过这个选项。在事务上创建记录时,将设置whenmodified列。在事务被处理、发送、用户验证等之后,它还会被更新几次。因此,每个记录的索引都必须更新几次,这可能会产生很大的影响。但是我们还没有尝试过在trunchWhenModified上创建一个基于函数的索引来查询您建议的日期