【问题标题】:Is DataSet slower than DataReader due to...?由于...,DataSet 是否比 DataReader 慢?
【发布时间】:2010-11-12 00:16:07
【问题描述】:

DataSets 在从数据库中检索数据时可能比DataReader 慢 10 倍以上。我认为这是由于DataSets 必须处理关系等的开销。但是DataSetsDataReader 之间的速度差异是由于DataSets 必须从DB,还是由于应用程序必须进行更多处理,或两者兼而有之?

我假设 DataAdapter 在后台使用 DataReader,因此应用程序需要执行的命令数才能检索 100 行 DataAdapter 等于或大于应用程序需要执行的命令数,如果这些100 行由DataReader 直接检索。 DataReader 是一次检索一行还是一次检索一个字段(特定行的)?

【问题讨论】:

  • 你怎么知道 DataSets 比 DataReaders 慢 10 倍?即使接近这个数字,我也没有测量出任何差异,更像是 +/- 5% 的差异。
  • 你有那个“10x”的参考或证据吗?
  • 不管细节如何,一般来说,DataReader 通常会快很多(根据我的经验,如果您的查询实际上返回许多行,几乎总是超过 5% - 否则没关系无论如何)。我不确定为什么 DataSet 慢得多,我想这是一个合理的问题。
  • 我已在以下链接阅读:devx.com/vb2themax/Article/19887/1954?pf=true

标签: c# ado.net dataset


【解决方案1】:

在 DataReader 上使用 DataSet 时可能会出现一些不同类型的开销:

DatSet 包含包含数据的 DataTable 对象,其中包含 DataRow 对象。创建所有对象的开销很小。每个 DataRow 都将其所有值视为对象,因此任何值类型都被装箱,这为每个字段增加了一些开销。

当您使用 DataAdapter 填充 DataSet 时,很容易获得大量您不会使用的数据。如果您不指定所需的字段,即使您不会全部使用它们,您也会获得所有字段。如果您不过滤查询,则会从表中获取所有行。即使您稍后使用 DataTable 上的 DataView 过滤它们,您仍然可以从数据库中获取它们。使用 DataReader,您更接近于获取数据的查询,因此与您在结果中获得的内容之间的联系更加明显。

如果您将数据提取到 DataSet 中的多个 DataTable 对象中,并使用关系让 DataSet 组合数据,那么您可以让 DataSet 完成您本可以让数据库完成的工作,这对其进行了更优化。

如果你很好地使用了 DataSet,开销也不会那么糟糕,而是 30% 而不是 1000%。

假设 DataAdapter 使用 DataReader 是正确的。如果你小心使用 DataAdapter,那么数据库操作本身就和你自己使用 DataReader 一样。

DataReader 将一次从底层数据库驱动程序获取一条记录,而该驱动程序又将一次从数据库中获取一个充满记录的缓冲区。如果记录非常大,一次可能只有一条记录可以放入缓冲区,但缓冲区中通常有数十条记录,如果它们真的很小,甚至有数百条记录。

【讨论】:

    【解决方案2】:
    【解决方案3】:

    DataReader 类似于旧的 ADO 概念,即只进记录集。只进记录集不需要维护任何类型的指针信息,因此总是比传统的DataSet 实例快。因此,DataReader 不会缓存任何数据,需要打开与数据库的连接才能获取底层数据。

    这解释了为什么您需要为DataReader 编写以下代码:

    DataReader reader = GetANewDataReaderInstance();
    while (reader.Read())
    {
        ...
    }
    

    现在与DataSet 相比,情况发生了很大变化。本质上,您可以将数据库模式的子集拉入DataSet,例如表关系、删除和更新规则,当然,当您将数据提交到数据存储时,自动重新填充数据集中的行。 DataSets也可以进行“断连”操作,即可以获取所需数据并关闭数据库连接。

    总结
    然而,所有这些功能都是有代价的:如果您希望尽快填充自定义业务对象,请使用DataReaders,否则请使用DataSets。

    【讨论】:

      【解决方案4】:

      对您在 Internet 搜索中找到的内容要非常小心。您发布的文章说

      使用 .NET 的候选版本之一

      编写的 VB.NET 应用程序

      那是大约七年前的事了!

      请务必查看更新的内容:

      【讨论】:

        【解决方案5】:

        阅读 Scott Mitchell 的 Why I Don't Use DataSets in My ASP.NET Applications。我认为它涵盖了您感兴趣的重点。

        【讨论】:

        • 那篇文章展示了一个令人难以置信的图表,该图表展示了随着结果数量从 100 增加到 1000 的数据集从 1 秒攀升到 10 秒。坦率地说,这不太可能。
        【解决方案6】:

        我更喜欢使用 DataReader 来填充列表。

        您可以通过一些好的 cmets/answers 查看我最近提出的问题:

        Datasets

        【讨论】:

          猜你喜欢
          • 2010-11-08
          • 2010-09-24
          • 1970-01-01
          • 2015-06-03
          • 2011-10-26
          • 2015-07-20
          • 2013-10-31
          • 2011-02-12
          • 2010-11-13
          相关资源
          最近更新 更多