与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/