对于每一条插入语句,我都会在SQL Server Profiler中看到sp_executesql


4

在调整我们的数据库和查询我们的产品之一时,我决定在QA环境中打开Profiler并查看它显示的内容。

我看到了我调用的每个插入,都使用insert语句的文本调用了sp_executesql。

这似乎是一个很大的打击,有没有办法把它关掉?

环境:

  • 的SQL Server 2008 R2标准
  • 的Windows Server 2008 R2企业
  • 32 GB RAM
  • 2x4的至强
9

我不会太担心。

这个想法是参数化报表重用。也就是说,可以避免编译

考虑你有3个不同的客户端上运行3个独立的语句:

SELECT col1, col2 FROM SomeTable WHERE col3 = 1 

SELECT col1, col2 FROM SomeTable WHERE col3 = 15 

SELECT col1, col2 FROM SomeTable WHERE col3 = 42 

每一个都有不同的文本,因此将被编译到一个不同的计划。也就是说,3个编译和3个计划缓存。

现在,这3

EXEC sp_executesql 'SELECT col1, col2 FROM SomeTable WHERE col3 = @p0', '@p0 int', '1' 

EXEC sp_executesql 'SELECT col1, col2 FROM SomeTable WHERE col3 = @p0', '@p0 int', '15' 

EXEC sp_executesql 'SELECT col1, col2 FROM SomeTable WHERE col3 = @p0', '@p0 int', '42' 

这里可重复使用的计划是语句SELECT col1, col2 FROM SomeTable WHERE col3 = @p0让你有一个计划是缓存。

在繁忙的系统中,这个编译时间很重要。而大多数查询更复杂那么这当然是:你经常可以看到本作第一次运行VS后续运行时间(见Testing Query Speed

而且在复杂和繁忙的系统然后计划缓存大小可能有限,或从数据占用RAM远高速缓冲存储器(缓冲池)也会阻碍事物。极端可能是一个10000计划或一个忙碌的网络应用程序。 (效果取决于32位和64位的微妙之处)

有些ORM和驱动程序允许您关闭此功能,通常是“准备好的语句”或某种选项:但要警告它可能会减慢速度。你说“这似乎是一个很大的打击”,这意味着你担心加载...

+2

很好的解释*为什么有些系统会这样做。它可以让他们在不使用存储过程的情况下参数化他们的SQL。 15 9月. 112011-09-15 19:06:11


4

我不知道我的理解,你想停止使用sp_executesql?如果是这样,那么你只需要改变你的代码不使用这种方法。我相信.NET中的SQLCommand对象将使用sp_executsql,因此如果您使用的是.NET,那么您应该会看到此调用。


5

如果您使用的是大多数ORM(Link2SQL,EF等),它们会导致使用这个可爱的小方法。如果你正在编写一个参数化插入语句,它也会通过这个方法来实现。

  0

所以我无法绕过这使用参数化插入?像...一样吗? 15 9月. 112011-09-15 13:05:38

  0

不是。你唯一的选择是使用你自己的存储过程。 15 9月. 112011-09-15 17:19:53