【发布时间】: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 行数据集的响应时间不到一秒“真的很糟糕”吗?
标签: database oracle plsql query-optimization