索引UTC日期时间列和TO_CHAR



我们在上有索引,该列是物理类型UTC日期时间,在其中一个代码中,我们在where子句下使用了该列,如下所示:

where
TO_DATE(TO_CHAR(**<column>**,'MM-DD-YY HH24:MI:SS'),'MM-DD-YY HH24:MI:SS') >  TO_DATE(TO_CHAR(RUN_DATE,'MM-DD-YY HH24:MI:SS'),'MM-DD-YY HH24:MI:SS')

我们的DBA标记出TO_CHAR的使用将确保索引永远不会被使用。

你能帮我理解这是对还是错以及背后的原因吗?多谢。

函数几乎总是阻止索引被使用。但是,在这种情况下,您似乎是在比较两个列的值,因此在这种情况下也很少使用索引。

如果您确实需要索引用于此目的,您可以考虑两件事。首先,您可以将其中一列存储为另一列的差异…例如,如果第一列是创建日期,第二列是运行日期,那么您可以存储运行日期,而不是日期本身。

另一种可能是对差异进行索引:

create index idx_t_col1_col2
    on t(col1 - col2)

然后在代码中可以这样写:

where (col1 - col2) = 0

或:

where (col1 - col2) >= 0 and (col1 - col2) < 1

只是给Gordon的答案添加颜色(这是正确的答案,应该这样标记)。

首先,它可以帮助你学习如何使用EXPLAIN PLAN。在Toad或SQL Developer中(如果您使用其中一个前端与数据库交互),它就像运行查询一样简单-只需单击另一个按钮,就可以获得EXPLAIN PLAN。

第一个问题:如果你在to_date(to_char(…),…)中包装一个日期,两个函数都有相同的完整掩码,优化器是否足够聪明,可以感知到这一点,并删除两个函数,只使用那个日期?答:没有;EXPLAIN PLAN表明谓词没有像这里建议的那样简化。它还显示date_column > SYSDATE将使用索引,但是如果您将日期列包装在to_date(to_char(.....))中,那么引擎将执行全表扫描(它将不使用索引)。

第二个问题:即使没有函数调用,不等式也会导致这个问题吗?比较date列(已索引,未封装在函数中)和SYSDATE使用索引。

比较两个列,第一个是Primary Key,第二个是NOT INDEXED,结果是一个完整的扫描(由比较引起的,没有函数围绕任何列)。

另一列上的索引(除了第一列上的主键)是否有助于不等式过滤器?回答:没有。同样,在第二列上创建索引并再次运行EXPLAIN PLAN之后,仍然对表进行全面扫描。正如Gordon解释的那样

相关内容

  • 没有找到相关文章

最新更新