оптимизация левого соединения - PullRequest
4 голосов
/ 17 ноября 2011

У меня есть база данных, аналогичная упрощенной ниже.Мне нужно получить столбцы: col8, col9, col10, col11, col12 (те, что я обвел

В настоящее время я использую левое соединение для объединения каждой таблицы, но это приводит к тому, что запрос принимает оченьlong (записей много). После профилирования наибольшее влияние оказывает запись в таблицу tmp.

Я ограничиваю результат до 24, но из-за левых соединений он все еще копирует тысячи записей втаблица tmp.

http://oberto.co.nz/demo/assets/db2.jpeg

Может ли это быть оптимизировано для извлечения обведенного столбца из каждой таблицы, используя соединение с помощью pk?

Спасибо.

Ответы [ 2 ]

1 голос
/ 17 ноября 2011
SELECT a.col12, b1.col8, c1.col9, d1.col10, e1.col11
FROM a
INNER JOIN (SELECT b.col8, b.col2, b.col3 FROM b 
            WHERE b.col2 = a.col2 GROUP BY b.col8) b1 
        ON (b1.col2 = a.col2)
INNER JOIN (SELECT c.col9, c.col3, c.col4 FROM c 
            WHERE c.col3 = b1.col3 GROUP BY c.col9) c1 
        ON (c1.col3 = b1.col3)
INNER JOIN (SELECT d.col10, d.col4 FROM d 
            WHERE d.col4 = c1.col4 GROUP BY d.col10) d1 
        ON (d1.col4 = c1.col4)
INNER JOIN (SELECT e.col11, e.col6 FROM e 
            WHERE e.col6 = a.col6 GROUP BY e.col11) e1 
        ON (e1.col6 = a.col6)

Теперь у вас больше не будет повторяющихся строк.
Возможно, вам придется поэкспериментировать с LEFT вместо INNER объединений.
И если вам не нужен отбор, вы должны устранить егопотому что это замедляет ход событий.

0 голосов
/ 17 ноября 2011

в его текущей и простейшей форме, я бы запросил ...

SELECT STRAIGHT_JOIN
      a.col1,
      a.col12, 
      b.col8, 
      c.col9, 
      d.col10, 
      e.col11
   FROM a
      left join b
         on a.col2 = b.col2
         left join c
            on b.col3 = c.col3
            left join d
               on c.col4 = d.col4
      left join e
         on a.col6 = e.col6

Тем не менее, произойдет корректировка после прочтения других критериев, фильтров, условий, «требований» к левому / внутреннему объединению, которые могут помочь в дальнейшей оптимизации.

...