2011-08-25 5 views
0

Можно создать дубликат:
SQL JOIN: is there a difference between USING, ON or WHERE?Sql Оптимизация запросов

Рассмотрим, если у меня есть две таблицы с именами А и В, А имеет 2 миллиона строк и B имеет только 100 строк, когда я использую эти SELECT заявления, нужно ли мне знать разницу между этими двумя

SELECT A.C1, B.C1 
FROM A, B 
WHERE A.C1 = B.C2 

Второй является

SELECT A.C1, B.C1 
FROM A 
INNER JOIN B ON A.C1 = B.C2 

Я смотрю на уровень производительности, и мне нужно знать разницу между ними. Когда я поговорил с моим коллегой, он сказал мне, что первый запрос - «Крест», это уменьшит производительность, но я так не думаю.

Пожалуйста, помогите.

Какой запрос вы предлагаете здесь и почему?

ответ

9

В работе нет никакой разницы. Первый - это , а не крест, так как он имеет то, что представляется действительным WHERE.

Единственное отличие состоит в том, что второе соответствует стандартам ANSI-92. Я лично предпочитаю использовать второй, ANSI-совместимый запрос, но это действительно зависит от вас.

Также читайте: ANSI vs. non-ANSI SQL JOIN syntax

+0

+1 да, ** всегда ** используйте вторую версию - «INNER JOIN» с условием JOIN намного яснее.Кроме того: с первым (устаревшим) синтаксисом JOIN у вас всегда есть опасная возможность забыть указать условие соединения (вам нужно) и, следовательно, может закончиться нежелательным декартовым продуктом .... –

+1

Я думал, что они оба ANSI , ANSI 89 по сравнению с ANSI 92, по крайней мере, это то, что я взял из предыдущих вопросов по теме ... –

+0

Для внутренних соединений оба синтаксиса являются стандартом ANSI по SQL92. –

3

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

+0

отражает вашу логику базы данных? –

+0

Это означает, что он отражает логику базы данных, поскольку условие where не является реальным «фильтром» логически, а является условием объединения. – TomTom

0

Как всем известно, существуют различные этапы выполнения запроса SQL. Первое, что выполняется, - это предложение From, тогда он передается в предложение Where, а предложение Select выбирает только указанные поля из набора строк, окончательно возвращенных из предложения Where.

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

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

The Select From A, B - очень старая конструкция и сохраняется только для использования в неизбежных обстоятельствах. Предложения Clive были введены для повышения производительности и, безусловно, должны быть предпочтительным выбором.

Надеюсь, это помогло :)

+0

Я действительно ожидал этого. Не могли бы вы поделиться с нами некоторыми убедительными доказательствами, чтобы доказать это? Я собираюсь на дебаты .. :) –

+0

У вас есть что-то задокументированное? –

+0

-1 Это плоская ложь. – NullUserException

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