【问题标题】:SqlDataReader performance differences in accessing values?SqlDataReader 访问值的性能差异?
【发布时间】:2009-02-05 16:24:04
【问题描述】:

当从 SqlDataReader 访问值时,这两者之间是否存在性能差异:

string key = reader.GetString("Key");

string key = reader["Key"].ToString();

在此代码示例中:

string key;

using (SqlDataReader reader = cmd.ExecuteReader())
{
    while (reader.Read())
    {
        key = reader.GetString("Key");
        // or
        key = reader["Key"].ToString();
    }
}

【问题讨论】:

    标签: c# asp.net sqldatareader


    【解决方案1】:

    我刚刚浏览了 .NET 源代码,这两种访问方法本质上是相同的。唯一的区别是第二个进行了额外的拳击。所以第一个对应于类似的东西(在基本类型的情况下):

    int key = GetInternalSQLDataAsInt32("Key");
    

    而第二个是:

    int key = (int)(object)GetInternalSQLDataAsInt32("Key");
    

    GetInternalSQLDataAsInt32(...) 函数表示将数据从 SQL 编组到 .NET 的 SQL 数据库机制。

    但如上所述,基于字符串的键和基于序号的键之间可能存在更显着的差异。

    【讨论】:

      【解决方案2】:

      一位 Microsoft MVP 写了一篇关于此的博客文章: http://jeffbarnes.net/portal/blogs/jeff_barnes/archive/2006/08/09/Maximize-Performance-with-SqlDataReader.aspx

      这是他的结论:

                                          .NET 1.1    .NET 2.0
      Ordinal Position:                   8.47        9.33
      Get Methods:                        11.36       8.07
      Case Sensitive:                     14.51       12.53
      Case Insensitive (All Upper):       13.93   12.23
      Case Insensitive (All Lower):       14.47   12.48
      Case Insensitive (Mixed):           14.48   12.57
      

      但实际上,除非您要处理大量行,否则不必担心。

      【讨论】:

        【解决方案3】:

        即使有,与一开始从数据库中获取数据的成本相比,它也不太可能产生重大影响。

        我个人更喜欢第一个版本 - 它表明我希望该列是一个字符串列,而不是取一个数字并将其转换为字符串。

        【讨论】:

          【解决方案4】:

          虽然您的代码需要修改;使用序数是最快的方法。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-04-18
            • 2015-10-28
            • 1970-01-01
            • 2014-05-27
            • 1970-01-01
            • 1970-01-01
            • 2019-04-24
            • 2010-10-14
            相关资源
            最近更新 更多