【发布时间】:2011-01-14 16:02:10
【问题描述】:
与 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 组合,结果相似。
【问题讨论】:
-
很抱歉这个显而易见的问题,但您的表格是否已编入索引?
-
ODP.Net 和 SQL 没法比较,一个是数据提供者,另一个是数据库服务器/引擎。您使用的是最新的 ODP.NET 吗?
-
@Brian 两个数据库上的数据结构是相同的。查询运行性能不是问题。只有数据检索。 @o.k.w 我的意思是说 SqlClient 而不是 SQL。
-
一一排除: 1) select 语句是否直接在每个数据库上以相同的速度运行? [来自 SQL 编辑器窗口] 2) 一台服务器锁定而另一台没有锁定? [导致同时查询的延迟] 3) 时间差是线性的吗? 【10行、1000行、10000行是不是快了10%?】
-
您是在设计时动态设置 Fetchsize 还是静态设置?
标签: c# performance oracle odp.net