2011-11-09 5 views
3

아래와 같은 쿼리가 있는데 A, T, S 테이블에는 약 1 백만 개의 행이 있고 P에는 1 억 개의 행이 있습니다. 필자는이 쿼리에 인라인 뷰 "temp"를 새로 도입했으며 성능이 크게 저하되었습니다. temp 용으로 검색된 데이터는 거의 50 행이 아니며이 인라인 쿼리는 단독 실행시 스냅으로 실행됩니다.Oracle의 인라인보기 성능 문제

자동 추적 통계에 따르면이 값을 추가 한 후 9 자리 숫자로 임시 숫자를 도입하기 전에 6 자리 숫자의 "일관성있는 가져 오기"수가 크게 증가했습니다! 또한 LAST_CR_BUFFER_GETS 중 90 % 이상이 '임시'보기로 간주됩니다. 이 뷰의 데이터를 임시 테이블로 추출하고 해당 테이블을 조인의 일부로 사용하면 성능이 매우 좋지만 그 솔루션은 실제로 실현 가능하지 않습니다.

저는이 질문이 매우 일반적이라는 것을 알고 있지만,이 인라인보기를 사용하는 데있어 사소한 문제가 있는지 궁금합니다. 인라인 뷰는이 데이터를 임시 테이블에 두는 것과 같은 성능을 제공하지 않습니까? 오라클이 효과적인 방식으로이 뷰를 사용하여 성능을 향상시킬 수있는 방법이 있습니까?

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

안녕하세요, 귀하의 쿼리 계획을 게시 할 수 있습니까? –

+1

실제 쿼리 (상점 전체에 구문 오류가 있음) 및 Explain 계획, 테이블 크기 등을 게시하고 우리가 시작할 수 있습니다. – Ollie

+3

subselect에 대한 카디널리티 예상치와 같은 소리가 울립니다. [이 문서] (http://www.oracle.com/technetwork/database/focus-areas/bi-datawarehousing/twp-explain-the-explain-plan-052011-393674.pdf)를 읽으십시오. – Gaius

답변

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; 

시도는이 쿼리를 실행하고 아마 인라인 뷰를 평가하는 것입니다 "온도를 제공하는이 쿼리 내 튜닝 경험을 바탕으로

1

추측 계획을 설명하시기 바랍니다 "A, t, p, s에 합류하여 얻은 결과 집합에서 일치하는 레코드 당 한 번. 가장 좋은 해결책은이 방법으로 다시 작성하는 것입니다. ORDERED 힌트는 FROM 절의 테이블을 원하는 순서대로 제공한다고 가정합니다. temp.id = s.id를 나열한 유일한 조인 조건으로 temp와 s를 먼저 나열했습니다. 또한 조인 기준의 일부인 다른 모든 열에 대해 인덱스가 있다고 가정합니다. 더 이상의 질문이 있으면 알려주세요.

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