我需要优化以下查询,但我不知道如何。
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毫秒的查询。它没有我们想要的那么好,但没关系。
由于
答案 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子句以消除重复项。