Скажите, что у меня есть запрос как тот ниже:
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 Вы используете, имеют значение?
Порядок присоединения не имеет значения.
Что делает разницу, является обеспечение вашей статистики актуальна.
Один из способов проверить свою статистику - это запустить запрос в SSMS и включить фактический план выполнения. Если предполагаемое количество строк очень отличается от фактического количества строк, используемых любой частью плана исполнения, то ваша статистика устарела.
Статистика перестраивается, когда связанные показатели перестраиваются. Если ваше окно обслуживания производства позволяет обновлять статистику каждую ночь.
Это обновит статистику для всех таблиц в базе данных:
exec sp_MSforeachtable "UPDATE STATISTICS ?"
Используйте встроенные классы (я не занимаюсь использованием 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.
Порядок соединений меняется только в том случае, если вы укажете OPTION (FORCE ORDER)
. В противном случае оптимизатор изменит порядок следования ваших запросов так, как сочтет наиболее эффективным.
На самом деле есть определенные случаи, когда я нахожу, что мне нужно использовать FORCE ORDER
, но, конечно, их мало и они далеки друг от друга. Если вы не уверены, просто УСТАНОВИТЕ СТАТИСТИКУ [TIME|IO] НА
и убедитесь сами. Вы, вероятно, обнаружите, что ваша версия работает медленнее, чем оптимизированная версия в большинстве, если не во всех случаях.