2010-08-03 5 views
0

다음 쿼리를 최적화해야하지만 어떻게 할 수 있는지 궁금합니다.4 테이블 관련 Oracle 쿼리 최적화

select distinct v.codvia, 
    v.codproine, 
    v.codmunine, 
    tv.SIMBOLO as SIMBOLO_TIPO_VIA, 
    tv.NOMBRE as TIPO_VIA, 
    c.nombrevia as NOMBRE_VIA, 
    v.cp, 
    m.nombre as NOMBRE_MUNICIPIO , 
    pr.nombre as NOMBRE_PROVINCIA 
    from tdinumvias v, tdimunicipio m, tdivia c, cditipovia tv, tdiprovincia pr 
where (pr.codine = v.codproine) and 
      (m.codproine = v.codproine and m.codine = v.codmunine) and 
     (c.codproine = v.codproine and c.codmunine = v.codmunine and 
     c.codvia=v.codvia and tv.idtipovia=c.idtipovia) 

위해 만든 인덱스가 있습니다 : v.codproine, v.codvia, v.codmunine, c.codmunine, pr.codine, m.codine, c.codproine, V는 .idtipovia 및 c.idtipovia

해당 테이블에는 성능이 여전히 매우 나쁩니다. 댓글에서


추가 : 테이블 크기는 tdinumvias에서 11M, tdimunicipio에서 10K, 나머지는 몇 행이 tdivia 에서 970K이다.

1 초 미만이 걸리며 100에서 200 밀리까지 얻을 수 있는지 궁금합니다.

업데이트

:

마지막으로 우리가 미리 계산하고보기로 컴파일 codmunie CP, codproine로 새로운 중간 테이블을 생성 한

은 다음 첫 번째 쿼리는이 뷰에서 데이터를 얻을 수 있도록,이 약에 쿼리를 얻는다 300-400 밀리미터. 우리가 원했던만큼 좋지는 않지만 괜찮습니다. 그들에 대한 필요성을 만드는 무엇 - 당신의 조인

SELECT DISTINCT v.codvia, 
     v.codproine, 
     v.codmunine, 
     tv.SIMBOLO as SIMBOLO_TIPO_VIA, 
     tv.NOMBRE as TIPO_VIA, 
     c.nombrevia as NOMBRE_VIA, 
     v.cp, 
     m.nombre as NOMBRE_MUNICIPIO , 
     pr.nombre as NOMBRE_PROVINCIA 
    FROM tdinumvias v 
    JOIN tdimunicipio m ON m.codproine = v.codproine 
        AND m.codine = v.codmunine 
    JOIN tdivia c ON c.codproine = v.codproine 
       AND c.codmunine = v.codmunine 
       AND c.codvia = v.codvia 
    JOIN cditipovia tv ON tv.idtipovia = c.idtipovia 
    JOIN tdiprovincia pr ON pr.codine = v.codproine 

검토 :

감사

내가
+0

현재 'EXPLAIN PLAN'에서이 검색어에 대해 말하는 것은 무엇입니까? – Dan

+0

각 테이블의 행 수와 쿼리가 예상되는 기간. –

+0

게리 나는 tdinumvias에서 약 11M, tdimunicipio에서 10K, tdivia에서 970K를 얻었습니다. 나머지는 몇 줄 밖에 없습니다. 1 초도 안 걸렸고 100 ~ 200 밀리까지 얻을 수 있는지 궁금합니다. – Fgblanch

답변

3

가독성을 제외하고 모든 성능 이점을 제공하지 않습니다 ANSI-92 구문을 사용하여 다시는 썼다 DISTINCT. 적어도 하나의 JOIN은 중복을 제거하기 위해 IN 또는 EXISTS 절로 변환되어야합니다.