zoukankan      html  css  js  c++  java
  • 商议Oracle数据库的数据导入措施1

      来历:csdn  




      前言

      每个数据库治理员都市道市情对数据导入的成就,这有可以迸发在数据库的新老移植过程中,或许是在数据库溃散后的规复重修过程中,另有可以是在创建测试数据库的模拟情形过程中,总之作为一名合格的数据库治理员,你应该做好领受各种数据导入乞求的妙技贮藏,同时还要只管满足人个性的对导入速率的苛求。本文仅针对 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%。

      CREATE TABLE AS SELECT,使用Oracle9i的External Table

       Oracle 9i 的一项新特性就是 External Table,它就象通常的数据库表一样,拥有字段和数据类型约束,并且可以查询,然则表中的数据却不存储在数据库中,而是在与数据库相讨论干系的通常内部文件里。当你查询 External Table 时,Oracle 将分析该文件并前往相宜前提的数据,就象该数据存储在数据库表中一样。

       需求注意的是,你可以在查询语句中将 External Table 与数据库中其他表遏制连接(Join),然则不克不及给 External Table 加上索引,并且不克不及拔出/更新/删除数据,终究效果它不是真正的数据库表。此外,要是与数据库相讨论干系的内部文件被改动或许被删除,这会影响到 External Table 前往查询效果,以是在转变前要先跟数据库打号召。





    版权声明: 原创作品,允许转载,转载时请务必以超链接方式标明文章 原始来因 、作者信息和本声明。不然将究查法令责任。

  • 相关阅读:
    sort将文件的每一行作为一个单位按ASCII码值进行比较
    as关键词还有另外一个用途,那就是修改 方法 的访问控制
    web前端 学习线路
    eclipse : java项目中的web.xml( Deployment Descriptor 部署描述文件 )配置说明
    Java: server/client 心跳机制实现 示例
    eclipse常用快捷键
    Java 最常用类(前100名)来自一万个开源项目
    Java 最常用类(前1000名) 来自GitHub 3000个项目
    java 程序编写规则(自己总结)
    logback:用slf4j+logback实现多功能日志解决方案
  • 原文地址:https://www.cnblogs.com/zgqjymx/p/1976064.html
Copyright © 2011-2022 走看看