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

上一篇:mysql-时间戳为int字段,查询性能


下一篇:sql-这是真的吗?性能问题