在Oracle V6 中 OCI
编制程序接口参加了数组接口特性。数组操作允许导入程序读取外界文件数量并剖析后,向数据库提交SQL语句,批量安排SQL 语句检索出的多少。Oracle 仅必要施行三次 SQL
语句,然后在内部存款和储蓄器中批量剖判提供的数量。批量导入操作比逐行插入重复操作更有功能,那是因为只需三回拆解解析SQL
语句,一些多少绑订操作以至程序与数据库之间往来的操作皆名高天下收缩,况且数据库对每一条数据的操作都是双重可以知道的,这给数据库提供了优化施行的恐怕。其亮点是数码导入的完整时间鲜明减小,极其是进度占用
CPU 的时刻。

缘何上一种艺术占用了超多的 CPU 管理时间,关键是 CALLS
表中已开立了目录,当一条数据插入到表中时,Oracle
须要剖断新数据与老多少在目录方面是还是不是有冲突,同不平时候要翻新表中的兼具索引,重复更新索引会消耗一定的小时。由此抓实导入速度的好法子就是在创造表时先不创立索引只怕在导入数据以前剔除全数索引,在表面文件数量逐个插入到表中后再统一创设表的目录。那样导入速度会增加,同时创造的目录也很紧密而使得,这一尺码一致适用于位图索引。对于第一的和独一的主要性节制(key
constraints卡塔尔(قطر‎,能够使之先一时失效(disabling卡塔尔国或然去除约束来赢得同等的功力,当然那一个做法会对已经存在的表的外键限制发生相关的熏陶,在剔除前供给通盘研讨。

命名空间:Oracle.DataAccess.Client

每一个数据库管理员都会晤对数据导入的题目,这有不小概率产生在数据库的新老移植进度中,大概是在数据库崩溃后的复苏重新建立进程中,还只怕有超大希望是在开立测量试验数据库的模拟条件进程中,综上可得视作一名合格的数据库管理员,你应该抓牢接纳种种数码导入诉求的技术储备,同时还要全心全意满意人本能的对导入速度的苛求。本文仅针对
Oracle
数据库所提供的加快数据导入的各类特色和手艺举办根究,当中的某个措施也能够转变应用于别的数据库。以下各类多少导入方法哪个最适用须要针对具体情况具体剖判,作者也顺便列举了影响导入速度的各样因素供讨论。为了比较种种数码导入方法的法力,笔者创建了示例表和数据集,并用各类措施导入示例数据集来总括总体导入时间和导入进程占用
CPU 时间,这里得出的年月仅供参照他事他说加以考察。要求验证的是,提议你利用 Oracle 9i
公司版数据库,当然你也足以品尝运用 Oracle 7.3
以上的标准版数据库。本文使用的机器配置为:CPU 英特尔 P4,内存256M,数据库 Oracle 9i 公司版。

82302284384,二零零二-04-18:13:18:58,5001,控诉,手提式有线电电话机三包维修质量82302284385,二〇〇三-04-18:13:18:59,3352,咨询,供水热线的编号82302284386,二〇〇三-04-18:13:19:01,3142,提出,增设公交线路

方式二:OracleBulkCopy

说明:

  1. OracleBulkCopy 接受 direct path 情势导入;

  2. 不支持 transaction,无法 Rollback;

  3. 若果该表存在触发器时,不能选用 OracleBulkCopy(报那些消息 Oracle
    Error: ORA-26086),除非先禁止使用该表的有着触发器;

  4. 进度中会自动启用 NOT NULL、UNIQUE 和 P奇骏IMAOdysseyY KEY 二种节制,此中 NOT
    NULL 节制在列数组绑按时说明,任何违反 NOT NULL
    节制标准的行数据都会吐弃;UNIQUE
    约束是在导入完结后重新建立索引时表达,不过在 bulk copy
    时,允许违反索引节制,并在完结后将引得设置成禁止使用(UNUSABLE)状态;并且,就算索引一初始情况便是禁止使用(UNUSABLE)状态时,OracleBulkCopy
    是会报错的。

参照代码如下:

  1 /// <summary>
  2 /// 批量插入数据
  3 /// 该方法需要禁用该表所有触发器,并且插入的数据如果为空,是不会采用默认值
  4 /// </summary>
  5 /// <param name="table">数据表</param>
  6 /// <param name="targetTableName">数据库目标表名</param>
  7 /// <returns></returns>
  8 public bool InsertBulkData(DataTable table, string targetTableName)
  9 {
 10     bool result = false;
 11     string connStr = GetConnectionString();
 12     using (OracleConnection connection = new OracleConnection(connStr))
 13     {
 14         using (OracleBulkCopy bulkCopy = new OracleBulkCopy(connStr, OracleBulkCopyOptions.Default))
 15         {
 16             if (table != null && table.Rows.Count > 0)
 17             {
 18                 bulkCopy.DestinationTableName = targetTableName;
 19                 for (int i = 0; i < table.Columns.Count; i++)
 20                 {
 21                     string col = table.Columns[i].ColumnName;
 22                     bulkCopy.ColumnMappings.Add(col, col);
 23                 }
 24                 connection.Open();
 25                 bulkCopy.WriteToServer(table);
 26                 result = true;
 27             }
 28             bulkCopy.Close();
 29             bulkCopy.Dispose();
 30         }
 31     }
 32 
 33     return result;
 34 }

测量试验结果:

数据类型:4列NVARCHAR2,2列NUMBER

30+万(7.36M):用时 14:590

60+万(14.6M):用时 28:28

1048576(24.9M):用时 52:971

叠合,禁用表的装有外键SQL:

ALTER TABLE table_name DISABLE ALL TRIGGERS

急需提示的是,通过 OCI
接口确实能够实行多少批量导入操作,可是洋洋工具和脚本语言却不补助选择此功能。假如要使用该措施,须求商量您所选用的开垦工具是不是援救OCI
批量操作作用。导入程序供给举行理并答复杂的编码并大概存在不当的风险,贫乏一定的弹性。

这种办法的长处是足以加速导入的进度并使索引越发严苛有效;劣点是缺乏通用性,当您对表扩展新的繁琐的格局元素时你需求加多代码、改革导入实行顺序。别的针对
7*24
在线必要的数据库在线导入操作时,删除表的索引会对在线客商的询问有超大的属性影响,相同的时候也要构思,首要或独一的第一约束规范的删除或失效恐怕会影响到援用它们的外键的选用。

总结

1、在30+万和60+万数量时,ArrayBind一回性导入和OracleBulkCopy时间相差不是比异常的大,不过ArrayBind情势雷同都急需更动数据方式,占用了一些日子,而
OracleBulkCopy 则只要求简单管理一下 DataTable 数据源就可以导入;

2、当数据量达到100+万时,ArrayBind
非常轻便现身内部存款和储蓄器不足卓殊,当时只得动用分批次试行导入,依据测量试验结果能够,次数越少,速度越快;而接纳OracleBulkCopy 情势则非常少现身内部存款和储蓄器不足现象,总体上看 OracleBulkCopy
占用内部存款和储蓄器比 ArrayBind 方式少;

3、采取 OracleBulkCopy 导入时,先要禁止使用该表全体触发器,如若该表存在自增
ID 触发器,就比较费力了,得先禁止使用改换的自增 ID
的触发器,然后手动自增设置要导入的数码,最后才方可导入;相同的时候,这种导入形式不可并发,四个整天只好有叁个客商在导入(因为自增ID交由程序管理),那个时候还要求锁表,幸免别的人还要批量导入数据;

批量布置,表暂时未有索引

示例表结商谈数据集

ODP.NET 版本:ODP.NET for .NET Framework 2.0 或 ODP.NET for .NET
Framework 4

82302284384,贰零零贰-04-18:13:18:58,5001,投诉,手提式无线电话机三包维修品质82302284385,二〇〇三-04-18:13:18:59,3352,咨询,供水热线的号码82302284386,2004-04-18:13:19:01,3142,提议,增设公共交通线路

次第数据插入 INSERT,表暂时未有索引

组件:Oracle.DataAccess.dll(2.112.1.0)

收受导入数据的表名是 CALLS,表构造如下:

亟需注明的是,这种措施在表中已存在好些个数码的动静下不太对劲。举个例子表中原来就有九千万条数据,而此刻供给充实插入一千万条数据,实际导入数据节省的时辰将会被重新创制一亿条数据的目录所消耗殆尽,这是我们不愿意收获的结果。不过,假若要导入数据的表是空的或导入的数据量比原来就有个别数据量要大得多,那么导入数据节省的时光将会一丢丢用以重新创制索引,当时该方法才得以思考选择。
加快索引创制是另三个亟需酌量的难题。为了收缩索引制造中排序的办事时间,能够在如今对话中加进
SORT_AREA_SIZE
参数的尺寸,该参数允许当前会话在内部存款和储蓄器的目录创造进度中施行越多的排序操作。相仿还足以选用NOLOGGING 关键字来减少因成立索引而转换的 REDO 日志量,NOLOGGING
关键字会对数据库的余烬复起和 斯坦dby
备用数据库爆发显著的熏陶,所以在采纳从前要紧密研讨,到底是速度优先还是安定团结优先。

参考资料:

1、ArrayBind

2、ArrayBind

3、Oracle数据导入方法

4、介绍OracleBulkCopy类

5、

相关文章