为什么如果我将查询作为参数化过程运行,它运行速度要快10倍,如果我直接将其作为参数化查询运行?
我在两种情况下都使用完全相同的查询,如果我从Management Studio或代码中的SqlCommand调用则无关紧要。
编辑:执行计划看起来不同。所以为什么?我用完全相同的参数集来调用它。
编辑:经过更多测试后,似乎只有在从SQL Management Studio运行参数化查询时才会出现10倍减速。
答案 0 :(得分:10)
我最近看到的一件事是,如果你设置错误的查询参数,它可能会导致重大问题。
例如,假设您有一个索引varchar列的参数,并使用SqlCommand的AddWithValue()
方法从.Net设置它。在这种情况下,你正处于一个受伤的世界。 .Net使用unicode字符串,并将您的参数设置为nvarchar而不是varchar。现在sql server将无法使用您的索引,您将看到显着的性能损失。
答案 1 :(得分:4)
了解他们是否使用相同的执行计划是在运行时显示它。在管理工作室中使用“包含实际执行计划”,看看有什么区别。
答案 2 :(得分:3)
在某些情况下,连接级设置可能至关重要,尤其是ANSI NULLS
,CONCAT NULL YIELDS NULL
等。特别是,如果您有计算持久性索引列(包括已提升) “xml”列),如果设置不兼容,它将不信任预先计算的索引值,并将为每一行重新计算(即表扫描而不是索引搜索)。
答案 3 :(得分:2)
参数化查询有很多advantages,包括通常会有很大的性能提升。
答案 4 :(得分:1)
参数嗅探可能会影响存储过程的性能。
http://omnibuzz-sql.blogspot.com/2006/11/parameter-sniffing-stored-procedures.html
答案 5 :(得分:-1)
存储过程可以更快地运行,因为执行计划由sql server缓存。
但是10次表现是可疑的。 在清除存储的执行计划后,它是否第一次运行相同?您可以使用这些命令清除缓存。但是他们清除整个服务器缓存,所以只在开发服务器上进行。
DBCC FREEPROCCACHE
DBCC FLUSHPROCINDB (<dbid>)
您是否直接在SQL服务器上运行它们以消除性能测试中的任何网络I / O?
我的猜测是它第一次运行缓慢,然后一旦缓存它运行得更快。