sp_executesql导致不期望的隐式转换

时间:2015-08-31 16:39:50

标签: c# sql sql-server

我已经有一段时间了。在SQL Server Profiler中,我确认使用SqlDataAdapter.Fill生成sp_executesql命令。有时,查询执行时间太长,原因通常是以下两种情况之一:

  1. 我的所有文本数据库字段均为varchar。我们知道sp_executesql仅接受unicode种类型nvarcharnchar)。在C#中为参数类型指定SqlDbType.Varchar有时会导致严重的性能问题(对于某些查询),因为为了将varchar参数转换为{{1}而进行隐式转换} nvarchar需要的。显然,每次扫描都会进行转换。
  2. 所以我指定了sp_executesql,问题暂时解决了。有一天,我最终遇到了同样的性能问题(对于不同的查询),但是以另一种方式。正在进行隐式转换,以将指定数据库列中的所有SqlDbType.NVarChar值转换为varchar。将类型还原为nvarchar可解决该案例的问题。
  3. 我知道问题不是由于参数嗅探,因为我尝试使用SqlDbType.VarChar刷新缓存的计划并使用sp_updatestats来确保生成新计划。但这并没有解决问题。 我无法绕过这个,我希望尽可能避免使用OPTION(RECOMPILE)。知道如何避免不希望的隐式转换吗?

    编辑:值得注意的是,生成的查询是动态的(来自查询构建器功能)。此外,值得注意的是,问题只出现在"包含"使用了操作数(在sql:sp_executesql中)。

    编辑:This好文章强调同样的问题。然而,他的作者遗憾地宣称没有解决方案......但是,希望如此。

0 个答案:

没有答案