c# oracle datareader,C#-OracleDataReader的性能不佳

与MS SQL Server相比,我从OracleDataReader对象读取数据时遇到了一些糟糕的性能.它慢了将近10倍,这是不可接受的.

以下是两个测试都使用的一些示例测试代码.从OracleDataReader读取数据的最佳方法是什么,是否有比以下所示更好的方法?

我很难相信ODP.Net甚至无法与SqlClient相提并论.

更新:我已将问题缩小为获取文本字段.由于某种原因,ODP.Net太糟糕了.任何想法如何解决?

void ReadData(System.Data.IDataReader dr, int maxRows)

{

ArrayList rows = new ArrayList(maxRows > 0 ? maxRows : 1000);

object[] row;

int rowsRead = 0;

while (dr.Read() && ((maxRows == -1) || (rowsRead++ < maxRows)))

{

row = new object[dr.FieldCount];

dr.GetValues(row);

rows.Add(row);

}

rows.Clear();

}

笔记):

>尝试使用FetchSize进行实验,并没有太大的不同

>查询运行时间在这里不是问题,仅是数据检索.

>两个数据库上的数据结构相同.

>尝试使用DataAdapter / DataSet组合获得相似的结果.

解决方法:

实际上,我们将此问题归结为使用CLOB列存储nvarchar(MAX)类型的字符串数据.

Oracle已经承认他们的OCI软件在处理CLOB时存在问题.默认情况下,他们尝试使用检索大​​型BLOB的相同方式来检索CLOB.他们设置指针,尝试进行分页等.当然,这种默认行为会影响常规的200个字符的文本字段,从而降低性能.通过将LOBFetchSize设置为-1,实际上可以关闭此行为.这样,它将在一次往返中获取CLOB的内容.然后事情开始飞起来,您将获得很好的性能.

即使这样,我们仍然遇到问题.我们确认了11.2版之前的OCI软件中的内存泄漏和内存引用错误.但是11.2在32位和64位方案中似乎都可以正常工作.

因此,将LOBFetchSize设置为-1是这里的性能修复工具.

标签:performance,oracle,c,odp-net

来源: https://codeday.me/bug/20191210/2100571.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值