我正在检查一些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这两种方法有什么不同?哪一个更快?它会影响执行计划吗?
发布于 2015-10-02 17:27:45
如果您使用sp_executesql的参数(如上面的示例所示),并且语句的文本在两次执行之间没有变化,那么为第一次执行生成的执行计划可能会用于后续执行。因此,它的性能可能与多次执行标准语句一样好(就像在第一个代码示例中一样)。
但是,sp_executesql语句的内容是作为独立于调用sp_executesql的批处理的执行计划编译和执行的,因此在这种情况下,它确实会对执行计划产生影响。
sp_executesql存储过程与标准直接语句之间的主要区别在于,前者可用于执行动态创建的语句。
https://stackoverflow.com/questions/28736805
复制相似问题