优化4表相关的oracle查询

时间:2010-08-03 02:06:53

标签: database oracle plsql query-optimization

我需要优化以下查询,但我不知道如何。

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 其他人只有几行。

它需要不到一秒的时间,我想知道是否有可能达到100 - 200毫秒。

更新

最后,我们创建了一个新的中间表,其中cp,codproine和codmunie预先计算并编译为视图,然后使第一个查询从此视图获取数据,这将获得大约300-400毫秒的查询。它没有我们想要的那么好,但没关系。

由于

1 个答案:

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

查看您的JOIN - 它们正在创造对DISTINCT的需求。至少需要将一个JOIN转换为IN或EXISTS子句以消除重复项。