我已经有一段时间了。在SQL Server Profiler中,我确认使用SqlDataAdapter.Fill
生成sp_executesql
命令。有时,查询执行时间太长,原因通常是以下两种情况之一:
varchar
。我们知道sp_executesql
仅接受unicode
种类型nvarchar
,nchar
)。在C#中为参数类型指定SqlDbType.Varchar
有时会导致严重的性能问题(对于某些查询),因为为了将varchar
参数转换为{{1}而进行隐式转换} nvarchar
需要的。显然,每次扫描都会进行转换。sp_executesql
,问题暂时解决了。有一天,我最终遇到了同样的性能问题(对于不同的查询),但是以另一种方式。正在进行隐式转换,以将指定数据库列中的所有SqlDbType.NVarChar
值转换为varchar
。将类型还原为nvarchar
可解决该案例的问题。我知道问题不是由于参数嗅探,因为我尝试使用SqlDbType.VarChar
刷新缓存的计划并使用sp_updatestats
来确保生成新计划。但这并没有解决问题。
我无法绕过这个,我希望尽可能避免使用OPTION(RECOMPILE)
。知道如何避免不希望的隐式转换吗?
编辑:值得注意的是,生成的查询是动态的(来自查询构建器功能)。此外,值得注意的是,问题只出现在"包含"使用了操作数(在sql:sp_executesql
中)。
编辑:This好文章强调同样的问题。然而,他的作者遗憾地宣称没有解决方案......但是,希望如此。