【发布时间】: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