我一直在使用 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,但我正在寻找一个更通用的解决方案。