优化一个4表相关的oracle查询
Posted
技术标签:
【中文标题】优化一个4表相关的oracle查询【英文标题】:Optimize a 4 table related oracle query 【发布时间】:2010-08-03 02:06:53 【问题描述】:我需要优化以下查询,但不知道该怎么做。
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.codmunine, c.codmunine, 前可待因, 可待因, c.codproine, v.idtipovia 和 c.idtipovia
在它的对应表中,但性能仍然很差。
从 cmets 添加: 表大小是 11M 在 tdinumvias, 10K 在 tdimunicipio, 970K 在 tdivia 其他的只有几行。
这需要不到一秒钟的时间,我想知道是否有可能将其提高到 100 - 200 英里。
更新:
最后我们创建了一个新的中间表,其中 cp、codproine 和 codmunie 预先计算并编译为一个视图,然后让第一个查询从这个视图中获取数据,这会得到大约 300-400 Millis 的查询。它没有我们想要的那么好,但没关系。
谢谢
【问题讨论】:
您当前的EXPLAIN PLAN
对此查询有何看法?
这些表中有多少行,以及您合理预期查询需要多长时间。
加里,我在 tdinumvias 中有大约 11M,在 tdimunicipio 中有 10K,在 tdivia 中有 970K,其他只有几行。它需要不到一秒钟的时间,我想知道是否有可能让它达到 100 - 200 英里。
鉴于您需要来自 tdinumvias 的 CP 值,除非您可以将 11M 过滤到数千行,否则您不会看到该数量级的性能提升。如果表格更新不多,则某种具体化视图可能是合适的。
@Fgblanch,你真的认为 11M 行数据集的响应时间不到一秒“真的很糟糕”吗?
【参考方案1】:
我使用 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 子句以消除重复项。
【讨论】:
以上是关于优化一个4表相关的oracle查询的主要内容,如果未能解决你的问题,请参考以下文章