Подтвердить что ты не робот

Применяет ли Sql JOIN порядок производительности?

Я просто подбирал некоторые sql, когда натолкнулся на этот запрос:

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 таблицы к этому

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

Это с SQL Server 2012.

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

Ответ 4

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

Для теста выполните следующие действия:

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

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

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

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

Ответ 5

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

Ответ 6

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