DataReader 中的 DataReader

Posted

技术标签:

【中文标题】DataReader 中的 DataReader【英文标题】:DataReader within a DataReader 【发布时间】:2011-08-31 01:26:17 【问题描述】:

我有一个 DataReader...我使用 DataReader 的结果作为另一个 DataReader 的参数,该 DataReader 连接到具有存储过程类型的命令。它现在运行得很快,但我担心我的数据库何时充满信息。我怎样才能加快速度?谢谢

【问题讨论】:

创建一个测试数据库并用千兆字节的信息填充它。 【参考方案1】:

您的初始查询可能会加入到存储过程生成的结果中。

【讨论】:

这是正确的解决方案。至少,您在执行嵌套在该查询中的 n 个子查询时保持数据库资源打开。让 sql 引擎为您完成这项工作。这就是sql擅长的——集合操作。 即使没有任何额外的/有形的性能优势,这也创造了一个更整洁的解决方案——当然是主观的,但不需要性能分析来论证——这就是我选择它的原因。我很懒:) 不应该为糟糕的代码与性能分析争论。当您添加复杂性或额外的移动部件以优化某些东西时,您应该不得不争论性能分析。正如您所指出的,它更快更整洁!当人们在不优化不是瓶颈的东西的保护伞下证明糟糕的代码时,这是我的一个小烦恼;)【参考方案2】:

基本上,您有 2 次数据库往返而不是 1 次。如果您经常调用它可能是一个性能问题并且结果很小并且您已经优化了查询和存储过程(所以相对于实际有用的工作而言,往返开销变得很大)。

基准测试,看看这个功能是否真的是一个瓶颈。如果是,您可以尝试在 SQL 级别“合并”这两个操作,以便它们可以一次性执行 server-size。

我不确定这是否与您的问题有关,但请记住(取决于您的 DBMS / ADO.NET 提供商),可能支持或可能不支持同一连接上的多个活动阅读器。您是否在打开第二个之前关闭了第一个 DbDataReader?如果不是,并且您碰巧切换到不同的 DBMS,则可能会有麻烦。如果我没记错的话,Oracle (ODP.NET) 和 DB2 支持多个阅读器,而 MS SQL Server 和 PostgreSQL (Npgsql) 不支持。

【讨论】:

Branko...你说得对,我有不止一个数据库往返。如果第一次读取包含 5 个条目,那将循环五次。当读者阅读时,另一个读者在里面。当它循环时,我将第一个阅读器的结果用于它下面的阅读器。在第一个阅读器的每次阅读中,我打开一个连接,关闭它并在它循环返回时重新打开一个新连接。我试图将连接放在一个池中,但没有得到太大的差异。你认为可能是什么问题?非常感谢。 顺便说一句,我有多个数据读取器实例,因此我不必担心关闭其他读取器。这是因为如果我关闭第一个阅读器并使用相同的变量来分配一个新的阅读器,那将处置阅读器。这样一来,reader 的数据在循环回来的时候就不可用了。 @Hakkai 所以你有“外部”阅读器保持活跃,而“内部”阅读器被一遍又一遍地重新创建?我最初的理解是只有一个“外部”阅读器和一个“内部”阅读器(并且没有循环)。顺便说一句,仅分配一个变量并不会处理变量的旧值。即使现在一切正常,请确保在循环的下一次迭代中创建新阅读器之前,在旧的“内部”阅读器上调用 DisposeClose。从您提供的信息中我无法确定,但您可能需要考虑在数据库级别进行 JOIN,因此只需要一个阅读器。 我现在正在努力在数据库级别创建一个过程。我预计性能会发生很大变化,因为我将从我的代码中执行一个过程,并且不需要在第一个循环返回时调用其他过程。谢谢你的主意。我现在只需要更改我的代码来分配检索到的值。 碰巧第一种方法是检索我需要的信息的最简单方法,但我不能冒性能风险。谢谢。

以上是关于DataReader 中的 DataReader的主要内容,如果未能解决你的问题,请参考以下文章

DataReader 中的倍数表

使用 SQL DataReader 中的变量 [重复]

SQL DataReader 如何显示查询中的空值

DataReader 循环查询中的 C# MySQL 查询

C# - 将 DataReader 转换为 DataTable

使用 datareader 中的股票数据时,Pandas 错误“没有要绘制的数字数据”