2013-05-03 2 views
33

Я просто прибирать некоторые SQL, когда я наткнулся на этот запрос:Влияет ли порядок SQL JOIN на производительность?

SELECT 
     jm.IMEI , 
     jm.MaxSpeedKM , 
     jm.MaxAccel , 
     jm.MaxDeccel , 
     jm.JourneyMaxLeft , 
     jm.JourneyMaxRight , 
     jm.DistanceKM , 
     jm.IdleTimeSeconds , 
     jm.WebUserJourneyId , 
     jm.lifetime_odo_metres , 
     jm.[Descriptor] 
FROM dbo.Reporting_WebUsers AS wu WITH (NOLOCK) 
     INNER JOIN dbo.Reporting_JourneyMaster90 AS jm WITH (NOLOCK) ON wu.WebUsersId = jm.WebUsersId 
     INNER JOIN dbo.Reporting_Journeys AS j WITH (NOLOCK) ON jm.WebUserJourneyId = j.WebUserJourneyId 
WHERE (wu.isActive = 1) 
     AND (j.JourneyDuration > 2) 
     AND (j.JourneyDuration < 1000) 
     AND (j.JourneyDistance > 0) 

Мой вопрос имеет ли какой-либо разницы в производительности то порядок стыки, как для вышеуказанного запроса, я сделал бы

FROM dbo.Reporting_JourneyMaster90 AS jm 

, а затем присоединились к другим 2 столам к этому

+0

Попробуйте запустить оба варианта и просмотреть планы выполнения. Разве они разные? Я бы не ожидал, что они будут. –

+0

Я никогда не слышал об этом, влияя на производительность. –

+0

Если такой простой запрос медленный, я бы предположил, что вам нужно посмотреть на индексацию. – HLGEM

ответ

27

Нет, при заказе изменяется порядок при оптимизации.

Единственное предостережение - это вариант FORCE ORDER, который заставит соединения произойти в том порядке, в котором вы их указали.

+0

У меня только что было пример с использованием MySQL, где это имело значение, потому что я заказывал дату, которая была присоединена к другой таблице. При переключении заказа время выполнения сократилось на 20%. И затем, добавив пейджинг, это сократило время выполнения на 80%. Поэтому я думаю, это зависит. – smerlung

4

Обычно нет. Я не 100%, это применяется дословно для Sql-Server, но в Postgres планировщик запросов оставляет за собой право переупорядочить внутренние соединения по своему усмотрению. Исключением является то, когда вы достигаете порога, за которым слишком сложно исследовать изменение порядка.

5

JOIN заказ не имеет значения, механизм запроса будет реорганизовать свой заказ на основе статистики для индексов и других вещей.

Для теста сделайте следующее:

  • выберите показать план фактического выполнения и запуск первого запроса
  • изменения JOIN порядка и теперь выполнить запрос снова
  • сравнить выполнение планов

Они должны быть идентичны, поскольку механизм запроса реорганизует их в соответствии с другими факторами.

Как прокомментировал другой asnwer, вы можете использовать OPTION (FORCE ORDER), чтобы использовать именно тот заказ, который вам нужен, но, возможно, он не был бы самым эффективным.

КАК общее правило большого пальца, порядок JOIN должен быть с таблицей наименьших записей сверху, а большинство записей последней, как и некоторые СУБД, порядок может иметь значение, а также если команда FORCE ORDER была использована для помочь ограничить результаты.

-5

Неправильно. SQL Server 2005 это определенно имеет значение, поскольку вы ограничиваете набор данных с начала предложения FROM. Если вы начинаете с 2000 записей вместо 2 миллионов, это делает ваш запрос быстрее.

29

Регистрация порядок в сервере SQL2008R2 это, безусловно, влияет на производительность запросов, в частности, в запросах, где имеется большое количество соединения таблиц с тем, где положения применяются в отношении нескольких таблиц.

Несмотря на то, что порядок объединения изменен в оптимизации, оптимизатор не пытается выполнить все возможные заявки на соединение. Он останавливается, когда находит то, что он считает работоспособным решением, поскольку сам акт оптимизации использует драгоценные ресурсы.

Мы видели запросы, которые выполнялись как собаки (1мин + время выполнения), доходят до второго значения, просто изменяя порядок выражений объединения. Пожалуйста, обратите внимание, что это запросы с 12-20 соединениями и предложениями по нескольким таблицам.

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

+2

Я работаю с SQL-сервером уже более 10 лет и впервые начал видеть, как JOIN влияет на производительность, как указано в этом ответе. Сбитый с толку, подумав, что оптимизатор лучше знает, я наткнулся на это, ища других, которые видели такое же поведение. Да, мои статистические данные актуальны. –

+3

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

+5

@TomTom Даже книга оптимизатора Grant Fritchey, основанная на затратах, рассказывает об этих конкретных сценариях, где «оптимизатор» отказывается от сложных запросов. Он даже может продемонстрировать это с помощью демонстрационной базы данных Microsoft. –

8

У меня есть яркий пример внутреннего соединения, влияющего на производительность. Это простое соединение между двумя таблицами. У одного было более 50 миллионов записей, у другого - 2000. Если я выбираю из меньшей таблицы и присоединяюсь к ней больше, ей требуется 5 + минут.

Если я выбираю из большего стола и присоединяюсь к меньшему, он занимает 2 мин 30 секунд.

Это с SQL Server 2012.

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

+11

Это улучшит ваш ответ, если вы сможете показать планы выполнения для обоих сценариев. – PeterVermont

+1

Ну, может быть, предложение where ограничивает большую таблицу в крошечный набор, пока оно не может уменьшить вашу меньшую таблицу? – user2173353

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