探究Oracle数据库的数据导入办法[Oracle防范]
本文“探究Oracle数据库的数据导入办法[Oracle防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
前言
每个数据库管理员城市面对数据导入的问题,这有大概发生在数据库的新老移植历程中,大概是在数据库崩溃后的恢复重建历程中,还有大概是在成立测试数据库的模拟环境历程中,总之作为一名合格的数据库管理员,你应当做好承受各种数据导入恳求的技术储备,同时还要尽大概满意人本能的对导入速度的苛求.本文仅针对 Oracle 数据库所供应的加快数据导入的各种特点和技术举行探究,此中的一些办法也可以转化利用于其他数据库.以下七种数据导入办法哪个最实用需求针对具体情形具体解析,我也附带摆列了影响导入速度的各种因素供考虑.为了对比各种数据导入办法的效果,我成立了示例表和数据集,并用各种办法导入示例数据集来计算总体导入时间和导入进程占用 CPU 时间,这里得出的时间仅供参考.需求阐明的是,倡议你利用 Oracle 9i 企业版数据库,当然你也可以尝试利用 Oracle 7.3 以上的尺度版数据库.本文利用的机械配置为:CPU Intel P4,内存 256M,数据库 Oracle 9i 企业版.
示例表构造和数据集
为了演示和对比各种数据导入办法,我假定数据导入任务是将外部文件数据导入到 Oracle 数据库的CALLS表中,外部数据文件包含十万条呼唤中央记录,将近 6MB 的文件大小,具体的数据示比方下:
82302284384,2003-04-18:13:18:58,5001,投诉,手机三包维修质量
82302284385,2003-04-18:13:18:59,3352,咨询,供水热线的号码
82302284386,2003-04-18:13:19:01,3142,倡议,增设公交线路
承受导入数据的表名是 CALLS,表构造以下:
Name Null? Type Comment ------------ --------- ------------- ----------------- CALL_ID NOT NULL NUMBER Primary key CALL_DATE NOT NULL DATE Non-unique index EMP_ID NOT NULL NUMBER CALL_TYPE NOT NULL VARCHAR2(12) DETAILS VARCHAR2(25) |
逐条数据插入INSERT
数据导入的最简单办法就是编写 INSERT 语句,将数据逐条插入数据库.这种办法只合适导入少量数据,如 SQL*Plus 脚本成立某个表的种子数据.该办法的最大缺陷就是导入速度迟钝,占用了大量的 CPU 处理时间,不合适大批量数据的导入;而其主要长处就是导入假想简单又有改正完善的弹性,不需求多做别的的预备便可以利用.假如你有很多时间没法打发,又想折磨一下数据库和 CPU,那这种办法正合适你.
为了与别的办法做对比,现将十万条记录通过此办法导入到 CALLS 表中,总共损耗 172 秒,此中导入进程占用 CPU 时间为 52 秒.
逐条数据插入 INSERT,表暂无索引
为什么上一种办法占用了较多的 CPU 处理时间,关键是 CALLS 表中已成立了索引,当一条数据插入到表中时,Oracle 需求辨别新数据与老数据在索引方面能否有冲突,同时要更新表中的全部索引,反复更新索引会损耗一定的时间.因此提高导入速度的好办法就是在成立表时先不成立索引大概在导入数据之前删除全部索引,在外部文件数据逐条插入到表中后再统一成立表的索引.这样导入速度会提高,同时成立的索引也很紧凑而有效,这一原则一样实用于位图索引(Bitmap Index).关于主要的和唯一的关键约束(key constraints),可以使之先暂时失效(disabling)大概删除约束来得到一样的效果,当然这些做法会对已经存在的表的外键约束产生相关的影响,在删除前需求通盘考虑.
需求阐明的是,这种办法在表中已存在很大都据的情形下不太符合.比方表中已有九千万条数据,而此时需求追加插入一千万条数据,实际导入数据节俭的时间将会被重新成立一亿条数据的索引所损耗殆尽,这是我们不但愿得到的后果.但是,假如要导入数据的表是空的或导入的数据量比已有的数据量要大得多,那么导入数据节俭的时间将会少量用于重新成立索引,这时该办法才可以考虑利用. 加快索引成立是另一个需求考虑的问题.为了削减索引成立中排序的工作时间,可以在当前会话中增添 SORT_AREA_SIZE 参数的大小,该参数答应当前会话在内存的索引成立历程中履行更多的排序操作.一样还可以利用 NOLOGGING 关键字来削减因成立索引而生成的 REDO 日记量,NOLOGGING 关键字会对数据库的恢复和 Standby 备用数据库产生明显的影响,所以在利用之前要细心考虑,毕竟是速度优先还是安定优先.
应用这种办法,先删除 CALLS 表的主键和不惟一的索引,然后逐条导入数据,完成后重新成立索引( 表在导入数据前是空的).该办法总共损耗 130 秒,包含重建索引的时间,此中导入进程占用 CPU 时间为 35秒.
这种办法的长处是可以加快导入的速度并使索引愈抓紧凑有效;缺陷是贫乏通用性,当你对表增添新的复杂的情势元素(索引、外键等)时你需求增添代码、改正导入执路程序.别的针对 7*24 在线要求的数据库在线导入操作时,删除表的索引会对在线用户的查询有很大的性能影响,同时也要考虑,主要或唯一的关键约束条件的删除或失效大概会影响到引用它们的外键的利用.
批量插入,表暂无索引
在Oracle V6 中 OCI 编程接口加入了数组接口特点.数组操作答应导入程序读取外部文件数据并解析后,向数据库提交SQL语句,批量插入 SQL 语句检索出的数据.Oracle 仅需求履行一次 SQL 语句,然后在内存中批量解析供应的数据.批量导入操作比逐行插入反复操作更有效率,这是因为只需一次解析 SQL 语句,一些数据绑订操作以及程序与数据库之间往复的操作都明显削减,并且数据库对每一条数据的操作都是反复可知的,这给数据库供应了优化履行的大概.其长处是数据导入的总体时间明显削减,分外是进程占用 CPU 的时间.
需求提醒的是,通过 OCI 接口确切可以履行数据批量导入操作,但是很多工具和脚本语言却不支持利用此功效.假如要利用该办法,需求研究你所利用的开辟工具能否支持 OCI 批量操作功效.导入程序需求举行复杂的编码并大概存在错误的风险,贫乏一定的弹性.
应用上述办法,程序将外部数据提取到内存中的数组里,并履行批量插入操作(100行/次),保存了表的删除/重建索引操作,总的导入时间下降到 14 秒,而进程占用 CPU 的时间下降到7秒,可见实际导入数据所耗费的时间明显下降了 95%.
以上是“探究Oracle数据库的数据导入办法[Oracle防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |