С SQL, каково ранжирование эффективности для каждого из типов объединения - PullRequest
2 голосов
/ 17 февраля 2011

JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN?

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

Также правильно ли я считаю, что JOIN & INNER JOIN - это одно и то же?Если нет, то как это вписывается в порядок / рейтинг.

Ответы [ 3 ]

3 голосов
/ 17 февраля 2011

Да, JOIN и INNER JOIN - это одно и то же. В общем случае ранжирование JOIN является самым быстрым, за ним следует LEFT JOIN, что эквивалентно RIGHT JOIN, а затем FULL JOIN очень далеко на расстоянии.

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

Несмотря на это, я бы посоветовал избегать ПОЛНОГО СОЕДИНЕНИЯ, если вам это абсолютно не нужно. (По крайней мере, в Oracle, где у меня был плохой опыт.)

2 голосов
/ 17 февраля 2011

INNER - необязательное слово, когда требуется INNER JOIN =>, поэтому они являются одним и тем же. Это то же самое, что и слово OUTER, являющееся необязательным в LEFT / RIGHT / FULL OUTER JOIN

С точки зрения эффективности это полностью зависит от того, что еще происходит. Если это ЛЕВОЕ СОЕДИНЕНИЕ с тестом IS NOT NULL с правой стороны (анти-полу-соединение), то это очень эффективно и работает как предложение EXISTS.

Отсутствуют другие факторы и учитываются только

SELECT .. FROM A X-JOIN B ON <condition>
  1. Если результаты должны быть сохранены из A, B или обоих, тогда эффективность не является фактором. Вам нужно соединение ВЛЕВО / ВПРАВО / ПОЛНОЕ, потому что оно дает правильные результаты

  2. Если вам нужны результаты, которые совпадают с обеих сторон, и не все данные доступны с обеих сторон, то, как и выше, вам нужно INNER JOIN .

  3. Только если объединение обязательно для поиска строк с обеих сторон, тогда объединение ВЛЕВО / ВПРАВО / ПОЛНОЕ становится опцией. В большинстве случаев INNER JOIN будет быстрее , поскольку дает оптимизатору возможность начинать с меньшей таблицы (или лучше индексировать) и сопоставлять хэш-значения с большей таблицей.

"в большинстве случаев" в пункте # 3, поскольку разные СУБД могут по-разному оптимизировать запросы.

1 голос
/ 17 февраля 2011

Ранжировать их по эффективности было бы бессмысленно, так как они дают разные результаты.Если вам нужно левое соединение, то внутреннее соединение не сделает эту работу.

Эффективность в соединении больше зависит от размера таблиц, индексации и того, как пишется остальная часть запроса, чем от INNER, OUTER, CROSS или FUll JOIN.CROSS JOIN для двух небольших таблиц может быть быстрым, но INNER-соединение для двух больших таблиц с условием WHERE, которое не может быть sargable, не будет.

...