【问题标题】:Inserts in Oracle table with array binding and CLOB is very slow使用数组绑定和 CLOB 在 Oracle 表中插入非常慢
【发布时间】:2021-02-12 20:18:53
【问题描述】:

我遇到的问题是在使用 CLOB 或 BLOB 时插入 Oracle 表需要很长时间。 我使用数组绑定(参见下面的示例)和 .Net Oracle 托管驱动程序。 一旦使用 OracleDbType Clob 或 Blob,插入速度就会大大降低。如果我将类型更改为 Varchar2,它会运行得非常快。不幸的是,这不是解决方案,因为我们的字符串可能会变得很长。

看起来我一使用 OracleDbType Clob,就会执行单个插入。

我错过了一个设置,还是一个错误或记录在案的行为?

插入 1000 条记录(见示例):

Data insert clob: 4,3272996
Data insert Varchar: 0,0231472

示例:

用 lob 创建表:

CREATE TABLE EXAMPLE_DATA
(
    ID NUMBER,
    DATA CLOB
);

单元测试


        [Fact]
        public void ExampleArrayBinding()
        {
            Stopwatch s = new Stopwatch();
            using (var connection = new OracleConnection(conString))
            {
                connection.Open();
                using (OracleCommand cmd = connection.CreateCommand())
                {
                    cmd.CommandText = "INSERT INTO EXAMPLE_DATA VALUES(:id, :data)";

                    // Add parameters to command parameters collection
                    cmd.Parameters.Add("id", OracleDbType.Int16);
                    cmd.Parameters.Add("data", OracleDbType.Clob);

                    // Set parameters values
                    cmd.Parameters["id"].Value = Enumerable.Range(1, 1000).ToArray();
                    cmd.Parameters["data"].Value = Enumerable.Range(1, 1000).Select(x => $"a{x}").ToArray();
                    cmd.ArrayBindCount = 1000;

                    //clob Parameter
                    this.TruncateTable("EXAMPLE_DATA", connection);
                    s.Start();
                    cmd.ExecuteNonQuery();
                    s.Stop();
                    this.output.WriteLine("Data insert clob: " + s.Elapsed.TotalSeconds);

                    //varchar2 Parameter
                    this.TruncateTable("EXAMPLE_DATA", connection);
                    s.Restart();
                    cmd.Parameters["data"].OracleDbType = OracleDbType.Varchar2;
                    cmd.ExecuteNonQuery();
                    s.Stop();
                    this.output.WriteLine("Data insert Varchar: " + s.Elapsed.TotalSeconds);
                }
            }

        }

【问题讨论】:

    标签: .net oracle performance insert clob


    【解决方案1】:

    我能理解问题所在,但测试结果更差。

    数据插入 clob:16,7964261
    数据插入 Varchar: 0,0375037

    我查看了Oracle Support forum 并找到了技术说明Performance Problems Using Clob and Blobs (Doc ID 401589.1),尽管它适用于驱动程序的非托管版本,但它可能描述了您的问题。
    根据此技术说明,如果 clob 的数据大小小于 32K,blob 的数据大小小于 64K,则应将 clob 数据绑定为 varchar2,将 blob 数据绑定为 byte[]。

    【讨论】:

      猜你喜欢
      • 2013-12-13
      • 1970-01-01
      • 2020-04-02
      • 1970-01-01
      • 2021-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多