Порядок СОЕДИНЕНИЙ имеет значение?

Скажите, что у меня есть запрос как тот ниже:

SELECT t1.id, t1.Name
FROM Table1 as t1 --800,000 records
INNER JOIN Table2 as t2 --500,000 records
ON t1.fkID = t2.id
INNER JOIN Table3 as t3 -- 1,000 records
ON t1.OtherId = t3.id

Я видел бы повышение производительности, если бы я изменил порядок своих соединений на Table2 и Table3. Посмотрите ниже:

SELECT t1.id, t1.Name
FROM Table1 as t1 --800,000 records
INNER JOIN Table3 as t3 -- 1,000 records
ON t1.OtherId = t3.id
INNER JOIN Table2 as t2 --500,000 records
ON t1.fkID = t2.id

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

6
задан Abe Miessler 28 January 2010 в 00:32
поделиться

3 ответа

Порядок присоединения не имеет значения.

Что делает разницу, является обеспечение вашей статистики актуальна.

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

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

Это обновит статистику для всех таблиц в базе данных:

exec sp_MSforeachtable "UPDATE STATISTICS ?"
6
ответ дан 10 December 2019 в 00:38
поделиться

Используйте встроенные классы (я не занимаюсь использованием FlexMock или Stubba / Mocha, просто чтобы показать точку)

def test_should_callout_to_foo
   m = Class.new do
     include ModuleUnderTest
     def foo
        3
     end
   end.new
   assert_equal 6, m.foo_multiplied_by_two
 end

Любая библиотека издевательства / окуривания. Также вы можете использовать структуры:

 instance = Struct.new(:foo).new
 class<<instance
     include ModuleUnderTest
 end
 instance.foo = 4

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

-121--1089034-

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

Многие из них больше о статистике, чем количество записей. Например, если подавляющее большинство значений в T1.FKID идентичны, эта информация может много влиять на Qo.

1
ответ дан 10 December 2019 в 00:38
поделиться

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

На самом деле есть определенные случаи, когда я нахожу, что мне нужно использовать FORCE ORDER, но, конечно, их мало и они далеки друг от друга. Если вы не уверены, просто УСТАНОВИТЕ СТАТИСТИКУ [TIME|IO] НА и убедитесь сами. Вы, вероятно, обнаружите, что ваша версия работает медленнее, чем оптимизированная версия в большинстве, если не во всех случаях.

3
ответ дан 10 December 2019 в 00:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: