.Net中的Oracle Datareader - 速度太慢(通过网络)

时间:2011-07-16 17:00:55

标签: .net oracle odp.net datareader oracleclient

在我得到“你试过ODP.net吗?”之前答案,是的,我现在正在使用它。

我正在将数据从oracle移动到sql server(不重要),并在oracle连接上使用datareader。更大的桌子是CRAWLING。有时甚至低至每秒10条记录。当我注意到性能问题时,我将源代码减少到只对整个表执行简单的Reader.Read()调用,因此没有其他任何东西会减慢它。我已经尝试了MS和Oracle ODP .net客户端。我目前正在使用11g Instant Client,64位win7 64bit,8 gig ram和所有好东西。我在本地网络上使用它,目前在VPN上,性能基本相同。我调整了预取大小而没有结果。

我可以在Oracle Sql开发人员工具中运行导出数据功能,并在同一台计算机上通过同一网络以大约100倍的速度导出整个数据库的所有数据。

我可以将我的.net应用程序复制到oracle服务器并对其运行相同的性能测试,并在不到一秒的时间内完成。

所以,网络本身并不慢,而且不是数据量(如SqlDeveloper导出所示),它不是.net代码本身,也不是oracle db(如在服务器上运行所示) ),所以它必须是在任何网络上使用的Datareader的某种组合。

是我的即时客户端安装吗?完整的客户端表现更好吗? 64位客户搞乱了吗?真的不知所措。

更新:

我已经运行了相同的应用程序,编译为32位,并在Windows xp的虚拟PC实例上运行,其中安装了“完整”oracle客户端(显然是32位版本)。即使VM的性能降低,它的运行速度也快了近10倍。所以,对于Instant客户端来说肯定存在某种问题,而我的猜测尤其是64位Instant Client。确认这一点的最后一个测试是在同一台机器上安装32位即时客户端并再次运行它。如果我能找到时间......

4 个答案:

答案 0 :(得分:0)

“我可以将我的.net应用程序复制到oracle服务器并对其运行相同的性能测试,并在不到一秒的时间内完成。”

这是您的解决方案的根源。相同的app,测试中的受控元素,从一个位置移动到另一个位置,唯一变化的变量是网络。那么我们有两种可能性。可能性之一是网络本身就是问题,它太慢了。第二,应用程序及其与网络的连接方式与其性能相悖。

当然,服务器上的执行与VPN上的位置之间存在偏差。使用服务器上的导出功能(尽可能接近原始访问权限)应该允许您根据在VPN Connected主机上执行相同操作所需的时间长度的差异来测量网络差异组件。

但是,正如您所指出的,这不能解释诱惑时间差异。应用程序可能对WAN不友好。这通常意味着发送和接收信息需要太多的转弯,并且每个数据流中的信息量可能比需要的大得多。从批量导出到应用程序的底层握手机制可能完全不同。一个人可能一次请求100个记录,而另一个可能按顺序提取每个记录(注意你的速度差异为100:1)。对于单个记录拉动的数据库握手的持续应用可能会大大增加您的开销并导致吞吐量下降。

答案 1 :(得分:0)

Try increasing the Fetch Size。越高,ODP.net为实际获取数据而必须进行的往返行程越少,网络上的性能就越好。 (请注意,如果启用了连接池,则AFAIK会自动完成。)

答案 2 :(得分:0)

盛尚者:你到底了吗?我遇到了类似的问题。通过玩Fetchsizes,我确实得到了一点点提升。 在我的测试环境中,它比prod小一个数量级,我在ODP.net看到1.8秒,在System.Data.OracleClient看到0.2秒。 通过提升fetchsize可以获得的最佳效果是1.6秒。

答案 3 :(得分:0)

我遇到了类似的问题,但这是间歇性的。我有一个Oracle查询,通常需要大约1秒才能运行,但有时在午餐时间使用.Net运行需要30秒。如果此时我在同一台机器上使用Oracle SQL Developer运行它仍需要1秒钟。

这个问题每天只持续约10分钟。我的同事也在同一时间得到同样的问题,同时也消失了。

所以看起来它可能是网络和.Net Oracle驱动程序的组合,但我不知道如何找到它。此外,其他SQL查询的执行速度也不慢,只有一个特定的查询只返回1200行。

编辑:我发现另一位同事在减速时正在通过网络进行大型文件复制。为了证明这一点,我让他再次这样做,同样的事情发生了 - 但是Oracle SQL Developer中的查询仍然很快。所以它是网络和.Net Oracle驱动程序的组合。我使用64位BTW。