2015-02-26 2 views
3

Я проверяю поведение некоторых 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 метода? какой из них быстрее? и влияет ли это на план исполнения?

+0

«кто быстрее» - вы честно думаете, что если бы между ними существовала измеримая разница, так что всегда была бы более быстрая по сравнению с более медленной, мы бы просто не переключили на использование более быстрого один? –

+0

@Damien_The_Unbeliever, так зачем использовать один над другим? это может повлиять на план выполнения. – developer82

+0

Угадайте: ORM, написанный до появления SQL Server 2005, использовал sp_executesql для повторного использования плана запросов (до SQL Server 2005 «необработанные» запросы не могли повторно использовать план выполнения). – Ginden

ответ

0

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

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

Основное отличие между хранимой процедурой sp_executesql и стандартным непосредственным оператором состоит в том, что первое может использоваться для выполнения динамически созданных операторов.

Смежные вопросы