代码之家  ›  专栏  ›  技术社区  ›  Kibbee

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

  •  0
  • Kibbee  · 技术社区  · 16 年前

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

    为了让你知道它有多慢,这里有一个例子。查询是对单个表的简单查找,where语句中的列被编入索引。指定数据类型时,某个查询的运行时间约为0毫秒(太小,sql server无法测量),需要41次读取。当我删除DBType时,大约需要200毫秒,10000次读取才能完成查询。

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

    [编辑]

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

    正如添加的信息一样,我在WindowsXPPro上运行.NET2.0,在Windows2000上为DB运行SQLServer2000。

    [更新]

    经过一番挖掘,我终于找到了这个 blog post ,这可能是相关的。似乎.Net中的字符串值(因为它们是unicode)会自动创建为nvarchar参数。我得等到星期一上班的时候,看看能不能解决这个问题。但似乎我必须设置数据类型,这正是我试图避免的。

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

    3 回复  |  直到 16 年前
        1
  •  5
  •   Richard Szalay    16 年前

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

        2
  •  2
  •   Will Shaver    16 年前

    我正好碰到了这个问题。我有一个遗留数据库,有很多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;
    
        3
  •  0
  •   Arion    13 年前

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

    我怀疑它假定值为varchar,而您没有显式指定它。

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

    推荐文章