2017-02-17 4 views
0

Если и внутреннее соединение, и левое соединение могут достичь того же результата, который быстрее и имеет лучшую производительность (особенно при больших данных)?внутреннее соединение против левого соединения - что быстрее для того же результата?

внутреннее соединение:

SELECT * 
FROM Table_A A 
INNER JOIN Table_B B 
ON A.PK_A = B.PK_B 

левое соединение:

SELECT * 
FROM Table_A A 
LEFT JOIN Table_B B 
ON A.PK_A = B.PK_B 

WHERE A.PK_A = B.PK_B 

Таблица A:

PK_A User 
1 FOX 
2 COP 
3 TAXI 
6 WASHINGTON 
7 DELL 
5 ARIZONA 
4 LINCOLN 
10 LUCENT 

TABLE_B:

PK_B Message 
1 TROT 
2 CAR 
3 CAB 
6 MONUMENT 
7 PC 
8 MICROSOFT 
9 APPLE 
11 SCOTCH 

Любые идеи? Как я могу проверить их производительность на больших данных?

+4

Почему ЛЕВАЯ ВСТУПЛЕНИЕ, если вы хотите ВСТУПИТЬ ВХОД? ...? – jarlh

+2

Второй - это не несущественный. Предложение where сделает ваше левое соединение действующим как внутреннее соединение. – GurV

+1

Вы проверяете это так же, как вы проверяете что-либо еще. Получите время в миллисекундах до и после запуска запроса и вычитайте. –

ответ

8

Добавляя оптимизатор WHERE A.PK_A = B.PK_B запрос является достаточно умны, чтобы понять, что вы хотите в inner join и использовать вместо. Таким образом, они будут иметь одинаковую производительность, так как будет создан тот же план выполнения.

enter image description here Так никогда использовать left join с where по клавишам, когда вы хотите inner join, это будет просто расстраивает, чтобы поддерживать и понимать.

+0

Приятные фотографии, но вопрос о производительности. –

+0

Правильный ответ. Внешнее объединение с условиями в 'WHERE' вместо' JOIN ON' будет рассматриваться как 'INNER JOIN' – Rahul

+0

@DanBracuk Как я сказал в своем ответе: _they будет иметь такую ​​же производительность, поскольку будет создан тот же план выполнения_ – Magnus

1

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

2

Прежде всего, входящие и левые соединения не совпадают. INNER JOIN получает все записи, которые являются общими между двумя таблицами

LEFT JOIN получает все записи из ЛЕВОЙ связаны таблицы, но если вы выбрали несколько столбцов из таблицы справа, если нет связанных записей, эти столбцы будут содержать NULL.

Очевидно, что с точки зрения производительности Inner Join быстрее. Надеюсь, что это поможет вам :)

+1

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

+0

Это зависит от того, что именно вы хотите получить. Если вы хотите получить данные только из левой таблицы, тогда перейдите в LEFT Join, это будет быстрее, но если вам нужны все данные, которые являются общими в обеих таблицах, то INNER Join намного эффективнее LEFT – CSK

+0

@DanBracuk, запуск левого соединения сразу после внутреннего соединения - или? – jarlh

Смежные вопросы