2

我有一个相当复杂的视图(在多个数据库链接中使用多层视图),它需要一秒钟才能返回所有行。但是,当我要求不同的行时,它需要更多的时间。4分钟后我停止等待。

为了让我尽可能清楚:

select a, b from compicated_view; -- takes 1 sec (returns 6 rows)
select distinct a, b from compicated_view; -- takes at least 4 minutes

我觉得这很奇怪,但是,嘿,就是这样。我猜 Oracle 在计划查询时搞砸了。现在,有没有办法强制 Oracle 首先完成选择而没有不同,然后对结果执行“选择不同 *”?我查看了优化器提示,但找不到任何关于提示应用 distinct 的顺序的信息(这是我第一次优化查询,显然 :-/)。

我在 Oracle 10g EE 上使用 Oracle SQl Developer。

4

2 回答 2

3

尝试:

SELECT DISTINCT A,B FROM (
   SELECT A,B FROM COMPLICATED_VIEW 
   WHERE rownum > 0 );

这会强制实现子查询并防止视图合并/谓词推送,并可能更改视图的原始计划。

您也可以尝试 NO_MERGE 提示:

SELECT /*+ NO_MERGE(alias) */ 
     DISTINCT a,b
FROM ( 
   SELECT a,b FROM COMPLICATED_VIEW 
) alias
于 2013-08-31T07:09:12.957 回答
0

由于您尚未发布详细信息...请尝试以下操作:

SELECT DISTINCT A,B
FROM
(SELECT A,B FROM COMPLICATED_VIEW);
于 2013-08-30T14:07:07.653 回答