我有一些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块,它将打开该光标以查看当我删除.Net代码时是否存在性能问题....希望这会有所帮助;但是如果你有任何额外的想法,我将非常感激。
再次感谢。这似乎是一个PL / SQL问题,而不是.NET问题。
答案 0 :(得分:3)
数据库实际上在做什么?
使用GROUP BY或ORDER BY的查询可能需要生成完整的结果集,然后在返回行之前对其进行排序/聚合。扫描一个大表的查询可能会在前几个块中找到50行,然后在找到另一个块之前读取另外十万个块。
我建议你忽略VB代码并发布数据库代码。
答案 1 :(得分:2)
我假设当你说“特定程序”时,你的意思是你正在调用一个具有OUT参数是REF CURSOR的Oracle存储过程。然后从过程返回的游标中获取DataReader。是这样的吗?
如果是这样,您是否可以消除.Net代码并编写一个调用该过程的PL / SQL块并从光标中获取所有数据以查看是否在那里获得了相同的行为?当光标打开时,Oracle不会实现数据 - 它会在客户端获取数据时实现结果。因此,如果Oracle必须实现并在找到第N + 1行之前过滤掉一堆数据,那么Oracle可能需要做很多工作才能获取第N行。如果您在数据库中运行的PL / SQL中看到相同的行为,那几乎肯定是正在发生的事情。如果您在PL / SQL块中没有看到任何问题,那么必须在中间层进行某些操作。
答案 2 :(得分:1)
对于问题的原始版本,只需要几个一般性评论:
如果您使用的是Microsoft .NET Framework的内置System.Data.OracleClient提供程序类,则Oracle's own updated .NET Provider可能会获得更好的性能。
如果时间在每次运行中移动,那么.NET垃圾收集器可能会在您的示例中没有看到的某些内存使用情况(即,如果许多对象被实例化并被丢弃)。