Оптимизация 4-страничного связанного оракула - PullRequest
0 голосов
/ 03 августа 2010

Мне нужно оптимизировать следующий запрос, но я не могу задаться вопросом, как.

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 Ответ

3 голосов
/ 03 августа 2010

Я переписал с использованием синтаксиса 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 в предложение IN или EXISTS.

...