比较两个类型为Date

时间:2018-07-03 23:26:12

标签: oracle

我正在查询Oracle中的视图,我不确定它是否相关,但是以防万一我复制生成视图的代码:

    select distinct cpc.Column1, cpc.Column2, //some other fields.. 
    from Table1 cpc inner join Table2 cpob on cpc.brand = cpob.brand 
    and cpc.ship = cpob.ship inner join Table3 cpvi on cpc.voyage = cpvi.voyage

这些查询很快:

select * from   MyView where rownum <=500 //fast
select * from   MyView where  VOYAGE >= '07-JUL-15'  and rownum <=500 //fast
select * from   MyView where   VOYAGE <= '07-JUL-17' and rownum <=500 //fast

但是当我需要根据日期范围来检索数据时,它会持续40秒左右……不好

select * from MyView where voyage >= '07-JUL-15' 
and voyage <= '07-JUL-17' and rownum <=500  //too slow --- around 40 seconds!

使用between而不是where ... and ...时也很慢。 我已经在表上为voyage创建了索引,但是速度仍然很慢。有什么想法可以改善此查询的性能吗?为什么只有当我添加where voyage >= '07-JUL-15' and voyage <= '07-JUL-17'时才这么慢?而不是其他查询?

1 个答案:

答案 0 :(得分:2)

您不比较日期,而是比较字符串。假设voyage的类型为DATE,它将被强制转换为字符串(使用数据库或会话中的默认日期格式),以便与查询中提供的字符串文字进行比较。这会导致Oracle查询优化器中的各种疯狂行为。

我建议您将字符串显式转换为日期,例如:

VOYAGE >= TO_DATE('07-JUL-15','DD-MON-YY')

或使用日期文字,例如:

VOYAGE >= date '2015-07-07'

这可能会或可能不会提高查询性能,但是根据您提供的信息,这是我的最佳建议。在询问有关Oracle中查询性能的问题时,包括实际的表/视图定义,表上存在的所有索引以及Oracle正在使用的实际查询执行计划会更有帮助。

(此外,我刚刚注意到您的视图包含DISTINCT运算符。这通常不利于良好的查询性能。请考虑您是否使用DISTINCT掩盖了视图定义中导致其产生重复项的逻辑缺陷。 )