2012-05-21 2 views
5

У меня есть 4 полноэкранных соединения в моем запросе и его очень медленный, так же порядок FULL OUTER JOIN влияет на производительность/результат?SQL Server: действительно ли порядок полного внешнего соединения?

FULL OUTER JOIN = ⋈

Затем

У меня ситуация: A ⋈ B ⋈ C ⋈ D

Все объединения происходят по ключевым общим для всех k, содержащихся во всех А, В, С, D

Тогда:

  • Будет ли изменение порядка ⋈ соединений влиять на производительность?
  • Изменится заказ ⋈ изменить результат?

Я чувствую, что это не должно повлиять на результат, но повлияет ли это на производительность или нет. Я не уверен!

Update:

Будет ли SQL Server автоматически перестраивать стыки для лучшей производительности предполагающей набор результатов будет зависеть от порядка?

+1

Результат должен быть таким же. Достаточно легко проверить работу. Сравните время, которое требуется, когда вы заказываете таблицы от нескольких до многих обращений в обратном порядке. –

+0

Почему бы не попробовать? Посмотрите на планы выполнения и трассировки SQL Profiler для разных комбо? – EBarr

+0

Когда вы говорите другой порядок, вы имеете в виду: '(ПОЛНОЕ ПРИСОЕДИНЕНИЕ b) ПОЛНОЕ ПРИСОЕДИНЕНИЕ c' vs 'ПОЛНОЕ ПРИСОЕДИНЕНИЕ (b ПОЛНОЕ ПРИСОЕДИНЕНИЕ c)' например? –

ответ

8

Нет, переупорядочение заказов JOIN не должно влиять на производительность. MSSQL (как и в других СУБД) имеет query optimizer, задачей которого является найти наиболее эффективный план запроса для любого заданного запроса. Как правило, они выполняют довольно хорошую работу - так что вы вряд ли сможете победить оптимизатора.

Это говорит о том, что иногда они ошибаются. Вот где reading an execution plan вступает в игру. Вы можете добавить JOIN hints, чтобы сообщить MSSQL, как присоединиться к вашим таблицам (в этот момент заказ делает вопрос). Обычно вы заказываете от самой маленькой до самой большой таблицы (хотя, с FULL JOIN, это вряд ли имеет значение) и следуйте за rules of thumb для типов соединений.

Поскольку вы делаете FULL JOINS, вы в основном читаете всего 4 таблицы с диска. Скорее всего, это будет очень дорого. Вы можете пересмотреть проблему и посмотреть, может ли она быть выполнена по-другому.

+1

+1: К OP - Важно отметить, что SQL не выполняется изначально и наивно. Фактически это просто альгортмическое выражение, чтобы рассказать оптимизатору о функциональном описании вашей проблемы. Затем оптимизатор эффективно компилирует его и выполняет план, который можно считать почти полностью независимым от SQL. – MatBailie

0

Изменение порядка полного внешнего соединения не должно влиять на производительность или результаты. Единственное, что будет зависеть от порядка полного Outer Join, - это порядок по умолчанию для столбцов, созданных при использовании SELECT *. У вас могут возникнуть проблемы с производительностью, если вы попытаетесь сделать несколько соединений с большими таблицами. Если для ограничения таблиц нет предложения where, вы можете пройти сотни тысяч результатов.

3
  • Изменится заказ ⋈ изменить результат?

Нет, порядок FULL JOIN не имеет значения, результат будет таким же. Обратите внимание, однако, что вы не можете использовать что-то вроде этого (нижеследующее может дать разные результаты в зависимости от порядка объединений):

SELECT 
    COALESCE(a.id, b.id, c.id, d.id) AS id, --- Key columns used in FULL JOIN 
    a.*, b.*, c.*, d.*      --- other columns     
FROM a 
    FULL JOIN b 
     ON b.id = a.id 
    FULL JOIN c 
     ON c.id = a.id 
    FULL JOIN d 
     ON d.id = a.id ; 

Вы должны использовать что-то вроде этого (нет никакой разницы в результатах независимо от порядка вливается):

SELECT 
    COALESCE(a.id, b.id, c.id, d.id) AS id, 
    a.*, b.*, c.*, d.*         
FROM a 
    FULL JOIN b 
     ON b.id = a.id 
    FULL JOIN c 
     ON c.id = COALESCE(a.id, b.id) 
    FULL JOIN d 
     ON d.id = COALESCE(a.id, b.id, c.id) ; 

  • Будет ли изменение порядка ⋈ соединений влиять на производительность?

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

+0

У меня нет коалесцирующей ситуации. Также см. Обновление в вопросе! –

+0

@Yugal: Чего это значит? Можете ли вы опубликовать 2 версии вашего запроса, чтобы мы поняли, что вы имеете в виду? Как вы присоединяетесь, если не используете 'COALESCE()'? –

+0

Хм .. что-то вроде '(A ⋈ B на A.sp = B.sp) ⋈ C на A.sp = C.sp' и т. Д. –

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