0

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

提前致谢,

卡尔斯

4

1 回答 1

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

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

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

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

    从表 1 t1,表 2 t2,...

    哪里(一些加入关系)

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

于 2013-06-06T15:36:30.527 回答