1

我一直在使用 cmd.Parameters.AddWithValue,并且没有指定 DBType (int, varchar,...) 来运行查询。查看 SQL Profiler 后,使用此方法运行的查询似乎比指定数据类型时运行得慢很多。

为了让您了解它有多慢,这里有一个例子。该查询是对单个表的简单查找,并且对 where 语句中的列进行索引。指定数据类型时,某个查询运行大约 0 MS(对于 sql server 来说太小无法测量),并且需要 41 次读取。当我删除 DBType 时,完成查询可能需要大约 200 毫秒和 10000 次读取。

我不确定这是否只是 SQL Profiler 误报的值,或者这些值实际上是否正确,但它是可重现的,因为我可以添加和删除 DBType,它会生成 SQL Profiler 中给出的值。

有没有其他人遇到过这个问题,以及解决它的简单方法。我意识到我可以在整个代码中添加数据类型,但这似乎需要添加很多东西,如果有更简单的方法来修复它,那将不胜感激。

[编辑]

经过一些初始测试(在循环中运行两个场景)后,探查器给出的值似乎是准确的。

正如添加的信息一样,我在 Windows XP Pro 上运行 .Net 2.0,在 Windows 2000 上为 DB 运行 SQL Server 2000。

[更新]

经过一番挖掘,我找到了这篇博文,这可能是相关的。似乎 .Net 中的字符串值(因为它们是 unicode)被自动创建为 nvarchar 参数。我将不得不等到星期一开始工作,看看我是否可以解决这个问题。似乎我必须设置数据类型,这是我试图避免的。

这个问题并没有出现在我所做的每个查询中,只是选择了几个,所以我仍然可能只是在有问题的查询中设置 DBType,但我正在寻找一个更通用的解决方案。

4

3 回答 3

5

该问题与 SQL Server 如何进行隐式类型转换有关。如果使用 NVARCHAR 值(即 N'some text')过滤 VARCHAR 列,SQL 将别无选择,只能将该列转换为 NVARCHAR,因为 NVARCHAR 不能隐式转换回 VARCHAR。

最好的解决方法是指定类型或将数据库列更改为 NVARCHAR。

于 2008-12-06T15:50:58.973 回答
2

我刚刚遇到了这个确切的问题。我有一个带有很多 char 列的旧数据库。在不指定列类型的情况下,我的一个查询的结果需要几分钟时间。(它默认为 nvarchar。)指定列类型导致结果需要几秒钟。

cmd.Parameters.AddWithValue("charcolumn", "stringvalue");
cmd.Parameters[0].SqlDbType = SqlDbType.Char;

我想我将尝试将每个字符串查询都设为 char 类型,看看效果如何。

[编辑]

实际上......阅读此内容后: http ://www.u2u.info/Blogs/U2U/Lists/Posts/Post.aspx?ID=11

我决定采用这个解决方案:

cmd.Parameters.AddWithValue(colName, val);
if(val is string)
  cmd.Parameters[i].DbType = DbType.AnsiString;
于 2009-06-16T15:08:18.843 回答
0

两种情况下生成的 SQL 语句是什么?

我怀疑当您没有明确指定它时,它会将值假定为 varchar 。

例如SELECT OrderId FROM Orders WHERE OrderId = 1001
SELECT OrderId FROM Orders WHERE OrderId = '1001'

于 2008-12-05T22:37:01.480 回答