代码之家  ›  专栏  ›  技术社区  ›  Rob P.

.NET中的Oracle DataReader存在很大的性能问题

  •  1
  • Rob P.  · 技术社区  · 15 年前

    我有一些Oracle过程可以生成/返回大量数据,我需要将这些数据写到一个文件中。我目前正试图用一个数据阅读器来完成。它似乎在工作,我已经成功地生成了479MB文件,没有任何问题。从我检索到数据阅读器完成文件不到4分钟。

    但我得到的一个特定过程的数据阅读器是 爬行 . 真是太慢了。我修改了我的代码,试图更好地了解正在发生的事情……

    System.Diagnostics.Debug.Write("Performing .Read() on DataReader: ")
    Dim d1 As DateTime = DateTime.Now
    Dim result As Boolean = myDataReader.Read()
    Dim ts As TimeSpan = DateTime.Now.Subtract(d1)
    System.Diagnostics.Debug.WriteLine(ts.ToString)
    

    有趣的是,我的输出结果是这样的:

    Performing .Read() on DataReader: 00:00:00
    Performing .Read() on DataReader: 00:00:00
    Performing .Read() on DataReader: 00:00:00
    Performing .Read() on DataReader: 00:00:00
    Performing .Read() on DataReader: 00:00:00
    Performing .Read() on DataReader: 00:00:00
    Performing .Read() on DataReader: 00:00:00
    Performing .Read() on DataReader: 00:00:00
    Performing .Read() on DataReader: 00:00:00
    Performing .Read() on DataReader: 00:00:00
    Performing .Read() on DataReader: 00:00:00
    Performing .Read() on DataReader: 00:00:00
    Performing .Read() on DataReader: 00:00:00
    Performing .Read() on DataReader: 00:00:00
    Performing .Read() on DataReader: 00:07:33.5037500
    

    我真的不知道下一步该怎么做。我看不到07:33.5037500的那一行有任何独特或不同之处。有什么建议吗?

    编辑:

    谢谢大家的回答。首先,据我所知,没有异常被抛出。正如建议的那样,我已经看了一看这个特殊的过程,它展示了上面的行为,虽然过程非常庞大;但是看起来它使用了大量的游标来填充Oracle临时表。返回的引用光标是该临时表中的select*。

    我正在编写一个pl/sql块,它将打开该光标,以查看删除.NET代码时是否存在性能问题……希望这会有所帮助;但如果您有其他想法,我们将非常感激。

    再次感谢。这似乎是一个PL/SQL问题,而不是.NET问题。

    3 回复  |  直到 15 年前
        1
  •  3
  •   Gary Myers    15 年前

        2
  •  2
  •   Justin Cave    15 年前