2012-04-16 3 views
0

Теоретически, почему внутреннее соединение работает значительно быстрее, чем левое внешнее соединение, учитывая тот факт, что оба запроса возвращают одинаковый набор результатов. У меня был запрос, который потребуется много времени, чтобы описать, но это то, что я видел, изменяя одно соединение: left external join - 6 секунд, внутреннее соединение - 0 сек (остальная часть запроса такая же). Вывод: тот жеSQL Server скорость: левое внешнее соединение против внутреннего соединения

+9

Вы сравнили планы выполнения? Если вы зададите неопределенный вопрос, я надеюсь, вы не ожидаете очень конкретных результатов. –

+0

Первое, что вам нужно сделать, если вы ожидаете результатов, - убедиться, что статистика (и индексы) обновлена. –

+0

@ Аарон Бертран Да, извините, не могу сообщить подробности. Планы исполнения выглядят по-другому, но я их не хорошо читаю. Во всяком случае, я просто подумал, может быть, есть общие причины для этого ... – ren

ответ

1

На самом деле в зависимости от данных, левое внешнее соединение и внутреннее соединение не будет возвращать тот же results..most вероятно, левое внешнее соединение будет иметь больше результата и снова зависит от данных ..

+1

Я не уверен, почему это ответ, а не комментарий. Хотя верно, что левое соединение может возвращать больше результатов в случаях, когда в правой таблице нет соответствующих строк, OP ясно указала, что в его случае два * do * производят идентичные строки. Это может быть связано с неверным запросом (например, критерии соединения/фильтра не в правильном месте), но может быть, что в левой таблице нет строк без соответствия в правой таблице. –

0

Я был бы обеспокоен, если бы изменил левое соединение на внутреннее соединение, и результаты не были разными. Я подозреваю, что у вас есть условие в левой части таблицы в разделе where эффективно (и, вероятно, неправильно), превращая его в внутреннее соединение.

Что-то вроде:

select * 
from table1 t1 
left join table2 t2 on t1.myid = t2.myid 
where t2.somefield = 'something' 

Который не то же самое, как

select * 
from table1 t1 
left join table2 t2 
on t1.myid = t2.myid and t2.somefield = 'something' 

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

Мое лучшее предположение о том, что левое объединение занимает больше времени, состоит в том, что оно соединяется со многими другими строками, которые затем отфильтровываются по предложению where. Но это просто дикая догадка. Чтобы знать, что вам нужно посмотреть планы исполнения.

+0

В целом я согласен, но, честно говоря, я построил запросы с помощью 'LEFT OUTER JOIN', хотя сегодня данные могут легко поместиться в' INNER JOIN' - результаты сегодня не обязательно будут результатом, который всегда будет, и могут появляться несогласованные строки, введенные позже (или которые были там в прошлом). Поэтому я не хочу слишком громко звучать будильники, если сегодня и внутренние, и внешние соединения будут давать те же результаты. Тот факт, что планы исполнения разные, заставляет меня поверить, что между двумя запросами больше различий, чем просто ключевые слова соединения. –

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