Oracle中的内联视图的性能问题

时间:2011-11-09 07:14:17

标签: performance oracle sql-tuning inline-view

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

autotrace统计数据显示,在添加此数据后,将temp引入9位数之前,6位数字的“一致获取”数量大幅增加!!此外,超过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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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;
  

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