甲骨文:“超级选择”的结果非常缓慢

时间:2013-06-06 08:53:31

标签: sql oracle subquery

我需要在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引擎是否可以在运行时识别并错误地重新设计查询以尝试使用它?

提前致谢,

卡尔斯

1 个答案:

答案 0 :(得分:0)

  1. “一些加入关系”?一些描述......

  2. 您正在使用非常重要的使用TEMP的distinct关键字。

  3. 如果p_date上有索引,请尝试使用提示:/ * + INDEX * /

    选择/ * + INDEX(table_name index_name)* / distinct p_date,column1,column2,...

    来自table1 t1,table2 t2,...

    其中(某些连接关系)

    和t1.p_date> TO_DATE( '010113', 'ddmmrr')