OracleDataReader的性能不佳

时间:2010-02-09 04:33:06

标签: c# performance oracle odp.net

与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();
 }

注(S):

  • 尝试使用FetchSize进行试验,没有太大的区别

  • 查询运行时间不是此处的问题,只是数据检索。

  • 两个数据库的数据结构完全相同。

  • 尝试使用类似结果的DataAdapter / DataSet组合。

1 个答案:

答案 0 :(得分:3)

我们实际上已经将此问题追溯到使用CLOB列来存储nvarchar(MAX)类型的字符串数据。

Oracle承认他们的OCI软件存在处理CLOB的问题。默认情况下,他们尝试检索CLOB的方式与检索非常大的BLOB的方式相同。他们设置指针,尝试进行分页等。当然,这种默认行为在常规~200字符文本字段中会导致性能下降。实际上,您通过将LOBFetchSize设置为-1来关闭此行为。这样它将在一次往返中获取CLOB的内容。事情开始飞行,你的表现非常好。

即便如此,我们仍然存在问题。我们在版本11.2之前的OCI软件中确认了内存泄漏和内存引用错误。但是11.2似乎在32位和64位情况下都能正常工作。

因此,将LOBFetchSize设置为-1是此处的性能修复程序。