当前位置:  开发笔记 > 数据库 > 正文

没有DBType的AddWithValue导致查询运行缓慢

如何解决《没有DBType的AddWithValue导致查询运行缓慢》经验,为你挑选了1个好方法。

我一直在使用cmd.Parameters.AddWithValue,而没有指定DBType(int,varchar,...)来运行查询.查看SQL事件探查器之后,使用此方法运行的查询似乎比指定数据类型时运行速度慢很多.

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

我不确定它是仅仅是SQL Profiler误报的值,还是这些值实际上是正确的,但它是可重现的,因为我可以添加和删除DBType,它将产生SQL Profiler中给出的值.

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

[编辑]

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

就像添加的信息一样,我在Windows XP Pro上运行.Net 2.0,在Windows 2000上运行SQL Server 2000 for DB.

[UPDATE]

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

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



1> Richard Szal..:

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

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

推荐阅读
ERIK又
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有