gpt4 book ai didi

c# - OracleDataReader 性能不佳

转载 作者:行者123 更新时间:2023-11-30 16:34:57 25 4
gpt4 key购买 nike

与 MS SQL Server 相比,我在从 OracleDataReader 对象读取数据时遇到了一些糟糕的性能。它几乎慢了 10 倍,这是 Not Acceptable 。

下面是两个测试都使用的一些示例测试代码。从 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com