2010-08-03 15 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,10K 在tdimunicipio,在tdivia 970K其他只有几行。

它需要一点点时间,我想知道是否有可能达到100 - 200 milis。

更新:

最后,我们已经创建了CP,codproine一个新的中间表和codmunie预先计算和编译成一个视图,然后进行第一次查询,从这一观点得到数据,这得到查询约300-400 Millis。它不如我们想要的那么好,但没关系。

感谢

+0

你目前的'EXPLAIN PLAN'对于这个查询说了什么? – Dan 2010-08-03 02:11:24

+0

每个表中有多少行,以及您合理预期查询需要多长时间。 – 2010-08-03 03:08:56

+0

加里我在tdinumvias有大约11M,tdimunicipio有10K,tdivia有970K,其他人只有几排。它需要一点点时间,我想知道是否有可能达到100 - 200 milis。 – Fgblanch 2010-08-03 03:37:52

回答

3

我使用ANSI-92语法,这将不会从可读性提供任何性能优势抛开重新写道:

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 

评论你的连接 - 他们是什么创造了必要DISTINCT。至少需要将一个JOIN转换为IN或EXISTS子句以清除重复项。