我需要在Oracle 11G中执行一个看起来像这样的选择:
select distinct p_date, column1, column2, ...
from table1 t1, table2 t2, ...
where (some join relations)
and t1.p_date > to_date('010113','ddmmrr')
在某些时候,我意识到p_date上的文件管理器使得查询非常慢,而没有p_date过滤器的相同查询几乎是立即的。 最重要的是,我意识到没有过滤器的查询返回了一小组结果,大约30行,所以我考虑将日期过滤器移到查询之外。
我尝试了这两个选项:
with temp as (
select distinct p_date, column1, column2, ...
from table1 t1, table2 t2, ...
where (some join relations)
) select * from temp where p_date > to_date('010113','ddmmrr')
和
select * from (
select distinct p_date, column1, column2, ...
from table1 t1, table2 t2, ...
where (some join relations)
) where p_date > to_date('010113','ddmmrr')
期望它几乎和内部查询一样快,因为它应该首先执行它,然后仅将p_date过滤器应用于返回的30行。
然而,在这两种情况下,执行时间都非常繁忙(我无法分辨多少因为我没耐心等待结果出现)。
有人可以告诉我为什么会这样吗?
作为旁注:表“table1”有一个p_date的索引,它看起来像预期的那样不起作用(我也在照顾它)。但是,Oracle引擎是否可以在运行时识别并错误地重新设计查询以尝试使用它?
提前致谢,
卡尔斯
答案 0 :(得分:0)
“一些加入关系”?一些描述......
您正在使用非常重要的使用TEMP的distinct关键字。
如果p_date上有索引,请尝试使用提示:/ * + INDEX * /
选择/ * + INDEX(table_name index_name)* / distinct p_date,column1,column2,...
来自table1 t1,table2 t2,...
其中(某些连接关系)
和t1.p_date> TO_DATE( '010113', 'ddmmrr')