【问题标题】:Bad performance with OracleDataReaderOracleDataReader 性能不佳
【发布时间】: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


【解决方案1】:

我们实际上已经将此问题追溯到使用 CLOB 列来存储 nvarchar(MAX) 类型的字符串数据。

Oracle 承认他们的 OCI 软件在处理 CLOB 时存在问题。默认情况下,他们尝试以与检索非常大的 BLOB 相同的方式检索 CLOB。他们设置指针,尝试进行分页等。当然,当涉及到常规的 ~200 字符文本字段时,这种默认行为会降低性能。实际上,您可以通过将 LOBFetchSize 设置为 -1 来关闭此行为。这样,它将在一次往返中获取 CLOB 的内容。然后事情开始飞起来,你会得到非常好的表现。

即使这样,我们仍然遇到问题。我们确认了 11.2 版本之前的 OCI 软件中存在内存泄漏和内存引用错误。但是 11.2 似乎在 32 位和 64 位场景中都可以正常工作。

因此,将 LOBFetchSize 设置为 -1 是此处的性能修复程序。

【讨论】:

    猜你喜欢
    • 2011-01-03
    • 2016-11-06
    • 2019-06-15
    • 2013-06-11
    • 2010-12-31
    • 2012-01-25
    • 2021-12-15
    • 2011-02-13
    • 2016-12-24
    相关资源
    最近更新 更多