我有一些 Oracle 程序生成/返回大量数据,我需要将这些数据写入文件。我目前正在尝试使用数据阅读器来完成。它似乎在工作,我已经成功地生成了一个 479mb 的文件,没有任何问题。从我检索 dataReader 到完成文件用了不到 4 分钟。
但是我为特定过程获取的 dataReader 正在爬行。它慢得令人难以置信。我修改了我的代码以尝试更好地了解正在发生的事情......
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 临时表。返回的 Ref Cursor 是一个 SELECT * FROM 该临时表。
我正在编写一个 PL/SQL block ,它将打开该游标以查看在我删除 .Net 代码时是否存在性能问题....希望这会有所帮助;但如果您有任何其他想法,我们将不胜感激。
再次感谢。这看起来确实是一个 PL/SQL 问题,而不是 .NET 问题。
最佳答案
数据库实际上在做什么?
具有 GROUP BY 或 ORDER BY 的查询可能需要生成完整的结果集,然后在返回行之前对其进行排序/聚合。扫描大型表的查询可能会在前几个 block 中找到 50 行,然后在找到另一个 block 之前再读取十万个 block 。
我建议你忽略 VB 代码并发布数据库代码。
关于.net - .Net 中 Oracle DataReader 的大性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4141175/