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