Я проверяю поведение некоторых ORM и Micro-ORM и проверяю, как они генерируют запросы, отправленные в базу данных (SQL Server).SQL Server - выполнение прямого запроса и выполнение с помощью sp_executesql
Что я замечаю 2 основных метода исполнения:
Прямое выполнение запроса:
select * from mytable
insert into mytable(val1, val2) values (@val1, @val2)
или что-то, что пользователи sp_executesql так:
exec sp_executesql N'INSERT INTO mytable(val1, val2) VALUES (@p0, @p1)',N'@p0 int,@p1 nvarchar(4000),@p0=1,@p1=NULL
чем разница между 2 метода? какой из них быстрее? и влияет ли это на план исполнения?
«кто быстрее» - вы честно думаете, что если бы между ними существовала измеримая разница, так что всегда была бы более быстрая по сравнению с более медленной, мы бы просто не переключили на использование более быстрого один? –
@Damien_The_Unbeliever, так зачем использовать один над другим? это может повлиять на план выполнения. – developer82
Угадайте: ORM, написанный до появления SQL Server 2005, использовал sp_executesql для повторного использования плана запросов (до SQL Server 2005 «необработанные» запросы не могли повторно использовать план выполнения). – Ginden