我正在检查某些ORM和Micro-ORM的行为,并检查它们如何生成发送到数据库的查询(SQL Server)。
我注意到的是两种主要的执行方法:
直接执行查询:
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
两种方法有什么区别?哪一个更快?它会影响执行计划吗?
答案 0 :(得分:0)
如果您正在使用sp_executesql的参数(如上例所示)并且语句的文本在执行之间没有变化,那么为第一次执行生成的执行计划可能会用于后续执行。因此,它可能与标准语句的多次执行一样高效(如在第一个代码示例中)。
然而,sp_executesql语句的内容被编译并执行为与调用sp_executesql的批处理的执行计划分开的执行计划,因此以这种方式对执行计划产生影响。
sp_executesql存储过程与标准直接语句之间的主要区别在于前者可用于执行动态创建的语句。