与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是这里的性能修复工具。

关于c# - OracleDataReader的性能不佳,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2226769/

10-16 14:55