0

甲骨文 11g

我有一个查询,其示意图如下所示:

select *
from
(
  --My inline view
  select ...
)
order by
  field1, field2;

我的内联视图是来自多个带有索引的表的复杂查询。

如果我只执行内联视图,使用索引和查询的 Oracle 执行速度很快。但是如果执行整个查询,Oracle 不使用索引并且查询执行速度很慢。

我找到了一种解决方案(使用两个步骤):

-- 1. I just creating temp table from my inline view (no sorting)
create global temporary table tmp
on commit preserve rows
as
--My inline view (Here Oracle using indexes and query runs fast)
select ...

-- 2. Now I sort it (result set is not very large and this runs also fast)
select * 
from tmp
order by
  field1, field2;

但如果可能的话,我想使用更简单的方法而不使用临时表。

我尝试使用“with” - 不走运,同样的问题。

很抱歉没有发布实际查询。它只是太复杂了,而且很难编写说明问题的示例脚本。

更新

子查询是多个UNION ALL来自SLOT, SLOT_O与 table 连接的表TLG_INFORMTLG_INFORM有一个索引IDX_TLG_INFORM_PAIR,它在没有ORDER BY和不使用的情况下使用 With ORDER BY

执行计划:

没有ORDER BY 没有 ORDER BY

ORDER BY 订购方式

我尝试使用WITH和提示/*+MATERIALIZE*/。没运气。此外,没有提示/*+MATERIALIZE*/索引也没有使用ORDER BY

没有ORDER BY. 没有 ORDER BY 的具体化

用 实现ORDER BY通过 ORDER BY 实现

4

2 回答 2

0

好的,如果没有具体细节,很难找到。由于查询的复杂性,发布示例脚本也非常困难,所以我之前发布的解决方案是临时表。

对临时表进行复杂查询的结果。并从需要排序的表中选择。大概,这是唯一的办法。

于 2021-03-23T07:22:48.417 回答
0

该问题可能表明 DBMS 对您的数据不够了解。更新表统计信息可能会有所帮助。

但也许这真的是优化器的一个缺陷。您应该能够通过物化 CTE 规避此问题:

with my_inline_view as (select /*+materialize*/ ...)
select *
from my_inline_view
order by field1, field2;
于 2021-03-23T07:43:18.493 回答