Итак, у меня есть запрос, который выглядит следующим образом:SQL Server 2014 темпа производительность переменного обновления
Declare @Table1 Table (some columns)
Insert into @Table1 [QueryA]
Update @Table1
set Field1 = A.Value1
from ([QueryB]) A
where Field2 = A.Value2
Select * from @Table1
QueryA
является простым запросом, который возвращает ~ 150 строк. QueryB
сложнее и возвращает 3 строки. При запуске самостоятельно, QueryB
возвращается менее чем за 1 секунду. При запуске внутри оператора обновления QueryB
занимает около 1 минуты.
Теперь, если запрос переформатирован, как это, все это занимает меньше секунды:
Declare @Table1 Table (some columns)
Insert into @Table1 [QueryA]
Declare @Table2 Table (some columns)
Insert into @Table2 [QueryB]
Update @Table1
set Field1 = A.Value1
from (select * from @Table2) A
where Field2 = A.Value2
Select * from @Table1
Кто-нибудь знает, почему это происходит? Я предполагаю, что что-то неуловимое происходит с движком оптимизатора, но если я что-то пропущу, я бы хотел его услышать.
Возможно, вы захотите посмотреть план выполнения. –
И, возможно, опубликуйте его тоже. –
План выполнения выглядит в основном одинаковым между двумя версиями запроса (отправка его будет затруднена из-за того, что QueryB является относительно сложным). –