3

我有一个如下所示的查询,表 A、T、S 有大约 100 万行,而 P 有超过 1 亿行。我在这个查询中新引入了内联视图“temp”,它导致性能急剧下降。为 temp 检索到的数据几乎没有 50 行,而且这个内联查询在单独执行时会迅速运行。

自动跟踪统计显示“一致获取”的数量从 6 位数字显着增加,然后将 temp 添加到 9 位数字!此外,超过 90% 的 LAST_CR_BUFFER_GETS 用于“临时”视图。如果我将此视图中的数据提取到一个临时表中并将该表用作连接的一部分,则性能非常好,但该解决方案对我来说并不可行。

我知道这个问题非常笼统,但我想知道使用这个内联视图是否有什么小错误。内联视图不会提供与将这些数据放在临时表中相同的性能吗?有什么方法可以提示 Oracle 以有效的方式使用此视图,从而提高性能。

   select t.id, 
          a.date
     from A a,
          T t,
          P p,
          S s,
          (select id 
             from S, 
                  R 
            where s.id = r.id 
              and r.code  = 10
                  r.code1 = 20
                  r.name  = 'string1' ) temp
    where ...cond1
          ...cond2
          ...cond2
    s.id = temp.id
4

2 回答 2

1

最好的猜测是,根据我的调优经验,它可能会根据通过加入 A、t、p、s 获得的结果集匹配的每个记录评估内联视图“temp”一次。这里最好的解决方案是以这种方式重写它。请记住,ORDERED 提示假定您在 FROM 子句中按照您希望它们加入的顺序提供表。我首先列出了 temp 和 s,因为这是您列出的唯一连接条件 temp.id = s.id。此外,我假设您在属于连接条件的所有其他列上都有索引。如果您还有其他问题,请告诉我。

select  /*+ ordered use_nl(a t p s) */
    t.id,  a.date
from    (
    select  id 
    from    S, 
        R
    where   s.id = r.id and r.code  = 10 r.code1 = 20 r.name  = 'string1' 
    ) temp,
    S s,
    A a,
    T t,
    P p
where   ...cond1 ...cond2 ...cond2 and s.id = temp.id
于 2011-11-23T05:27:15.693 回答
0
WITH TEMP AS
(select id 
         from S, 
              R 
        where s.id = r.id 
          and r.code  = 10
              r.code1 = 20
              r.name  = 'string1' )
select t.id, 
      a.date
 from A a,
      T t,
      P p,
      S 
where ...cond1
      ...cond2
      ...cond2
 s.id = temp.id;

尝试运行此查询,并请提供此查询的解释计划

于 2011-11-19T19:18:02.277 回答