对于每个插入语句,我在 SQL Server Profiler 中看到 sp_executesql

Jer*_*oyd 4 performance sql-server-2008 profiler

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

我看到对于我调用的每个插入,都会使用插入语句的文本对 sp_executesql 进行调用。

这似乎很受欢迎,有没有办法关闭它?

环境:

  • SQL Server 2008 R2 标准版
  • Windows Server 2008 R2 企业版
  • 32 GB 内存
  • 2x4 至强

gbn*_*gbn 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
Run Code Online (Sandbox Code Playgroud)

每一个都有不同的文本,因此将被编译成不同的计划。也就是说,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'
Run Code Online (Sandbox Code Playgroud)

这里的可重用计划是针对语句的,SELECT col1, col2 FROM SomeTable WHERE col3 = @p0因此您有一个计划是缓存。

在繁忙的系统中,这个编译时间很重要。并且大多数查询当然比这更复杂:您通常可以在第一次运行与后续运行时看到这一点(请参阅测试查询速度

同样在复杂和繁忙的系统中,计划缓存大小可能会受到限制,或者从数据缓存(缓冲池)中取出 RAM,这也会阻碍事情的发展。极端可能是 10000 个计划或一个繁忙的网络应用程序。(效果取决于 32 位与 64 位的细微差别)

某些 ORM 和驱动程序允许您将其关闭,通常是“准备好的语句”或某些选项:但请注意,它可能会减慢速度。您说“这似乎很受欢迎”,这意味着您担心负载...

  • 很好地解释了*为什么*某些系统会这样做。它允许他们在不使用存储过程的情况下参数化他们的 SQL。 (2认同)

mrd*_*nny 5

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