2010-08-03 4 views
0

Je dois optimiser la requête suivante mais je ne suis pas capable de me demander comment.Optimiser une requête oracle liée à 4 tables

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) 

il y a des indices créés pour: v.codproine, v.codvia, v.codmunine, c.codmunine, pr.codine, m.codine, c.codproine, v .idtipovia et c.idtipovia

Dans ses tables correspondantes, mais les performances sont toujours très mauvaises.


Ajouté des commentaires: Dimensions de la table sont 11M dans tdinumvias, 10K tdimunicipio, 970K dans tdivia les autres ont seulement quelques lignes.

Cela prend un peu moins d'une seconde et je me demandais s'il était possible de l'atteindre entre 100 et 200 milis.

Mise à jour:

Enfin, nous avons créé une nouvelle table intermédiaire avec cp, codproine et codmunie précalculées et compilé en vue, puis faire la première requête obtenir des données de ce point de vue, il obtient la requête dans environ 300-400 Millis. ce n'est pas aussi bon que nous le voulions mais c'est bon.

Merci

+0

Que dit votre 'EXPLAIN PLAN' actuel pour cette requête? – Dan

+0

Combien de lignes dans chacune de ces tables et combien de temps vous attendez-vous raisonnablement à ce que la requête prenne. –

+0

Gary j'ai environ 11M à tdinumvias, 10K à tdimunicipio, 970K à tdivia les autres n'ont que quelques rangs. Cela prend un peu moins d'une seconde et je me demandais s'il était possible de l'atteindre entre 100 et 200 milis. – Fgblanch

Répondre

3

je re-écrit en utilisant la syntaxe ANSI-92, qui ne fournira aucun avantage de performance en dehors de la lisibilité:

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 

Examinez votre JOIN - ils sont ce qui crée le besoin de le DISTINCT. Au moins un JOIN doit être converti en une clause IN ou EXISTS pour se débarrasser des doublons.