SQL Server - 直接执行查询 vs. 使用 sp_executesql 执行查询

4

我正在检查一些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

这两种方法有什么区别?哪一种更快?它会影响执行计划吗?


1
"哪一个更快" - 你真的认为如果两者之间有明显的差异,以至于总有一个更快一些而另一个更慢一些,我们不会都转向使用更快的那个吗? - Damien_The_Unbeliever
@Damien_The_Unbeliever 那么为什么要使用其中一个?可能会对执行计划产生影响。 - developer82
1
猜测:在 SQL Server 2005 变得流行之前编写的 ORM 使用 sp_executesql 来重用查询计划(在 SQL Server 2005 之前,“原始”查询无法重用执行计划)。 - Ginden
1个回答

0

如果您在使用 sp_executesql 的参数(如上面的示例)并且语句的文本在执行之间不会更改,则为第一次执行生成的执行计划可能会用于后续执行。因此,它很可能与标准语句的多次执行一样高效(如您的第一个代码示例)。

但是,sp_executesql 语句的内容将编译并作为独立于调用 sp_executesql 的批处理的执行计划执行,因此它确实对执行计划产生影响。

sp_executesql 存储过程和标准直接语句之间的主要区别在于前者可用于执行动态创建的语句。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接