我正在查询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'
时才这么慢?而不是其他查询?
答案 0 :(得分:2)
您不比较日期,而是比较字符串。假设voyage
的类型为DATE
,它将被强制转换为字符串(使用数据库或会话中的默认日期格式),以便与查询中提供的字符串文字进行比较。这会导致Oracle查询优化器中的各种疯狂行为。
我建议您将字符串显式转换为日期,例如:
VOYAGE >= TO_DATE('07-JUL-15','DD-MON-YY')
或使用日期文字,例如:
VOYAGE >= date '2015-07-07'
这可能会或可能不会提高查询性能,但是根据您提供的信息,这是我的最佳建议。在询问有关Oracle中查询性能的问题时,包括实际的表/视图定义,表上存在的所有索引以及Oracle正在使用的实际查询执行计划会更有帮助。
(此外,我刚刚注意到您的视图包含DISTINCT运算符。这通常不利于良好的查询性能。请考虑您是否使用DISTINCT掩盖了视图定义中导致其产生重复项的逻辑缺陷。 )