Внутренний SQL против вопроса о левом соединении - PullRequest
7 голосов
/ 30 июня 2011

У меня очень плохо выполняющийся SQL-запрос. Я проследил это до ВНУТРЕННЕГО СОЕДИНЕНИЯ, выполненного на столе. Изменение этого параметра на левое соединение значительно повышает производительность (с 6 минут до 20 секунд) - теперь я знаю, что 2 не эквивалентны, но ... вот что я спрашиваю

SELECT * 
  FROM SomeTable ST
  JOIN BigTable BT ON BT.SomeID = ST.SomeID 
                  AND BT.Something = ST.Something 
                  AND BT.AnotherValue = '123'

Поскольку у объединения есть дополнительные критерии (и что-то = что-то) - меняется ли это на левое объединение, дающее те же результаты - но НАМНОГО быстрее?

Полученные результаты такие же, как при использовании LEFT / INNER, а слева значительно быстрее ...

Ответы [ 2 ]

2 голосов
/ 30 июня 2011

Похоже, что обратное внутреннее соединение даст лучшую производительность ...

SELECT
    *
FROM
    BigTable AS BT
INNER JOIN
    SomeTable AS ST
ON
    BT.AnotherValue = '123'
AND
    BT.SomeID = ST.SomeID 
AND
    BT.Something = ST.Something

или с подзапросом

SELECT
    *
FROM
    (SELECT * FROM BigTable WHERE AnotherValue = '123') AS BT
INNER JOIN
    SomeTable AS ST
AND
    BT.SomeID = ST.SomeID 
AND
    BT.Something = ST.Something

Кроме того, убедитесь, что BigTable.AnotherValue правильно проиндексирован.

0 голосов
/ 30 июня 2011

Хотя вы получаете одинаковые результаты от обоих объединений, важно понимать, что левое соединение отличается от внутреннего объединения.

При левом соединении будут взяты все строки из левой таблицы, даже если в правой таблице нет совпадений.

SQL LEFT JOIN vs. SQL INNER JOIN

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

SELECT * 
  FROM SomeTable ST
  JOIN BigTable BT ON BT.SomeID = ST.SomeID 
                  AND BT.Something = ST.Something 
                  AND BT.AnotherValue = '123'

Как насчет этого:

SELECT
   *
FROM
   SomeTable
      INNER JOIN
   BigTable
      ON SomeTable.PreferedPrimaryKey = BigTable.PreferAForeignKey
      AND SomeTable.SomethingThatIsIndexedAndPreferableNumeric = BigTable.SomethingThatIsIndexedAndPreferableNumeric 
WHERE
   BigTable.AnotherValue = '123'

Проверьте ваши индексы и убедитесь, что ваши критерии для второй части объединения не являются неиндексированными символьными строками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...