与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组合。
答案 0 :(得分:3)
我们实际上已经将此问题追溯到使用CLOB列来存储nvarchar(MAX)类型的字符串数据。
Oracle承认他们的OCI软件存在处理CLOB的问题。默认情况下,他们尝试检索CLOB的方式与检索非常大的BLOB的方式相同。他们设置指针,尝试进行分页等。当然,这种默认行为在常规~200字符文本字段中会导致性能下降。实际上,您通过将LOBFetchSize设置为-1来关闭此行为。这样它将在一次往返中获取CLOB的内容。事情开始飞行,你的表现非常好。即便如此,我们仍然存在问题。我们在版本11.2之前的OCI软件中确认了内存泄漏和内存引用错误。但是11.2似乎在32位和64位情况下都能正常工作。
因此,将LOBFetchSize设置为-1是此处的性能修复程序。