为什么SQL Server上的查询速度慢但程序快?

时间:2009-02-23 14:27:16

标签: sql-server sql-server-2005

为什么如果我将查询作为参数化过程运行,它运行速度要快10倍,如果我直接将其作为参数化查询运行?

我在两种情况下都使用完全相同的查询,如果我从Management Studio或代码中的SqlCommand调用则无关紧要。

编辑:执行计划看起来不同。所以为什么?我用完全相同的参数集来调用它。

编辑:经过更多测试后,似乎只有在从SQL Management Studio运行参数化查询时才会出现10倍减速。

6 个答案:

答案 0 :(得分:10)

我最近看到的一件事是,如果你设置错误的查询参数,它可能会导致重大问题。

例如,假设您有一个索引varchar列的参数,并使用SqlCommand的AddWithValue()方法从.Net设置它。在这种情况下,你正处于一个受伤的世界。 .Net使用unicode字符串,并将您的参数设置为nvarchar而不是varchar。现在sql server将无法使用您的索引,您将看到显着的性能损失。

答案 1 :(得分:4)

了解他们是否使用相同的执行计划是在运行时显示它。在管理工作室中使用“包含实际执行计划”,看看有什么区别。

答案 2 :(得分:3)

在某些情况下,连接级设置可能至关重要,尤其是ANSI NULLSCONCAT NULL YIELDS NULL等。特别是,如果您有计算持久性索引列(包括已提升) “xml”列),如果设置不兼容,它将不信任预先计算的索引值,并将为每一行重新计算(即表扫描而不是索引搜索)。

答案 3 :(得分:2)

参数化查询有很多advantages,包括通常会有很大的性能提升。

  • 查询缓存
  • 字符串连接问题最小化
  • 解决SQL注入问题
  • 处理前不必将数据转换为字符串

答案 4 :(得分:1)

答案 5 :(得分:-1)

存储过程可以更快地运行,因为执行计划由sql server缓存。

但是10次表现是可疑的。 在清除存储的执行计划后,它是否第一次运行相同?您可以使用这些命令清除缓存。但是他们清除整个服务器缓存,所以只在开发服务器上进行。

DBCC FREEPROCCACHE
DBCC FLUSHPROCINDB (<dbid>)

您是否直接在SQL服务器上运行它们以消除性能测试中的任何网络I / O?

我的猜测是它第一次运行缓慢,然后一旦缓存它运行得更快。