优化一个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查询的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 查询技巧与优化 字符串操作

Oracle 查询技巧与优化 多表查询

oracle速度变慢,怎样解决

SQL性能优化(Oracle)

oracle 优化时间查询

求助Oracle大表查询优化