`

oracle 高效插入大量数据

 
阅读更多
  在很多时候,我们会需要对一个表进行插入大量的数据,并且希望在尽可能短的时间内完成该工作,这里,和大家分享下我平时在做大量数据insert的一些经验。
  前提:在做insert数据之前,如果是非生产环境,请将表的索引和约束去掉,待insert完成后再建索引和约束。
  insert into tab1 select * from tab2; commit;
  这是最基础的insert语句,我们把tab2表中的数据insert到tab1表中。根据经验,千万级的数据可在1小时内完成。但是该方法产生的arch会非常快,需要关注归档的产生量,及时启动备份软件,避免arch目录撑爆。
  alter table tab1 nologging;
  insert /*+ append */ into tab1 select * from tab2;
  commit; alter table tab1 logging;
  该方法会使得产生arch大大减少,并且在一定程度上提高时间,根据经验,千万级的数据可在45分钟内完成。但是请注意,该方法适合单进程的串行方式,如果当有多个进程同时运行时,后发起的进程会有enqueue的等待。注意此方法千万不能dataguard上用,不过要是在database已经force logging那也是没有问题的。
  insert into tab1 select /*+ parallel */ * from tab2; commit;
  对于select之后的语句是全表扫描的情况,我们可以加parallel的hint来提高其并发,这里需要注意的是最大并发度受到初始化参数parallel_max_servers的限制,并发的进程可以通过v$px_session查看,或者ps -ef |grep ora_p查看。
  alter session enable parallel dml;
  insert /*+ parallel */ into tab1 select * from tab2; commit;
  与方法2相反,并发的insert,尚未比较和方法2哪个效率更高(偶估计是方法2快),有测试过的朋友欢迎补充。
  insert into tab1 select * from tab2 partition (p1);
  insert into tab1 select * from tab2 partition (p2);
  insert into tab1 select * from tab2 partition (p3);
  insert into tab1 select * from tab2 partition (p4);
  对于分区表可以利用tab1进行多个进程的并发insert,分区越多,可以启动的进程越多。我曾经试过insert 2.6亿行记录的一个表,8个分区,8个进程,如果用方法2,单个进程完成可能要40分钟,但是由于是有8个分区8个进程,后发进程有enqueue,所以因此需要的时间为40分钟×8;但是如果用方法5,虽然单个进程需要110分钟,但是由于能够并发进程执行,所以总共需要的时间就约为110分钟了。
  DECLARE TYPE dtarray IS TABLE OF VARCHAR2(20)
  INDEX BY BINARY_INTEGER;
  v_col1 dtarray; v_col2 dtarray; v_col3 dtarray;
  BEGIN SELECT col1, col2, col3 BULK COLLECT INTO v_col1, v_col2, v_col3
  FROM tab2;
  FORALL i IN 1 .. v_col1.COUNT insert into tab1
  WHERE tab1.col1 = v_col1;
  END;
  用批量绑定(bulk binding)的方式。当循环执行一个绑定变量的sql语句时候,在PL/SQL 和SQL引擎(engines)中,会发生大量的上下文切换(context switches)。使用bulk binding,能将数据批量的从plsql引擎传到sql引擎,从而减少上下文切换过程,提升效率。该方法比较适合于在线处理,不必停机。
  sqlplus -s user/pwd< runlog.txt set copycommit 2;
  set arraysize 5000;
  copy from user/pwd@sid - to user/pwd@sid - insert tab1 using
  select * from tab2; exit EOF
  用copy的方法进行插入,注意此处insert没有into关键字。该方法的好处是可以设置copycommit和arrarysize来一起控制commit的频率,上面的方法是每10000行commit一次。
分享到:
评论

相关推荐

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    他认为对于SQL的学习是永无止境的,相信每一个查询Oracle数据库的人都需要精通SQL语言,才能写出高效的查询。他参与本书的编写就是为了帮助别人实现这一目标。 目录 封面 -11 封底 -10 扉页 -9 版权 -8 版权声明 -7...

    oracle数据库dba管理手册

    8.5.1 大量数据的插入:使用SQL*Loader Direct Path选项 212 8.5.2 大量数据的插入:常见陷阱和成功 诀窍 214 8.5.3 大量数据的删除:truncate命令 215 8.5.4 分区 216 8.6 调整物理存储 216 8.6.1 整理文件碎片 ...

    SmartVizor设计和批量(可变数据)打印系统

    3:大容量可变数据的插入和合成(可变数据包括文本、数字、图像、条形码)。 4:支持从Excel表格、Access数据库、文本文件,XML文件,Oracle,DB2,SQL Server等市场上大多数数据源中直接导入数据,支持用户自定义...

    iCMS 是一套采用 PHP 和 MySQL 构建的高效简洁的内容管理系统.zip

    PHP内置丰富的数据类型(如整型、浮点型、字符串、数组、对象等),并提供了大量的预定义函数,涵盖了字符串操作、数学运算、文件系统处理、日期时间处理、数据库连接等常见功能,极大提高了开发效率。 在Web开发中...

    数据库系统的核心是什么(1).docx

    数据库由数据库管理系统统一管理,数据的插入、修改和检索均要通过数据库管理系统进行。数据管理员负责创建、监控和维护整个数据库,使数据能被任何有权使用的人有效使用。数据库管理员一般是由业务水平较高、资历较...

    AppFramework_V1.0_New

    众所周知Oracle提供了ROWNUM实现数据数据库内分页功能,若要利用这一特性,就要在SQL模板里直接硬编码这些特殊语法,这必然导致大量的移植工作。 &lt;br&gt;第八、缺少代码生成和检查工具。程序里的变量名与Sql模板里的...

    AppFramework_V1.0

    众所周知Oracle提供了ROWNUM实现数据数据库内分页功能,若要利用这一特性,就要在SQL模板里直接硬编码这些特殊语法,这必然导致大量的移植工作。 &lt;br&gt;第八、缺少代码生成和检查工具。程序里的变量名与Sql模板里的...

    基于go、gorm、gin、mysql及layui构建的人力资源管理系统.zip

    移动应用与物联网(IoT):作为数据存储层,支撑大量设备的数据采集、存储和查询需求。 嵌入式系统:在资源有限的环境中,作为轻量级数据库解决方案。 总之,MySQL凭借其开源、跨平台、高性能、灵活扩展、丰富...

    基于Java Swing + MySQL + JDBC 的图书管理系统.zip

    移动应用与物联网(IoT):作为数据存储层,支撑大量设备的数据采集、存储和查询需求。 嵌入式系统:在资源有限的环境中,作为轻量级数据库解决方案。 总之,MySQL凭借其开源、跨平台、高性能、灵活扩展、丰富...

    独立开发的基于Django+weui+weui.js,mysql的移动电商项目,实现微信认证,登录,微信支付等功能.zip

    移动应用与物联网(IoT):作为数据存储层,支撑大量设备的数据采集、存储和查询需求。 嵌入式系统:在资源有限的环境中,作为轻量级数据库解决方案。 总之,MySQL凭借其开源、跨平台、高性能、灵活扩展、丰富...

    基于 nodejs express mysql 开发的留言板 demo.zip

    移动应用与物联网(IoT):作为数据存储层,支撑大量设备的数据采集、存储和查询需求。 嵌入式系统:在资源有限的环境中,作为轻量级数据库解决方案。 总之,MySQL凭借其开源、跨平台、高性能、灵活扩展、丰富...

    基于 jsp + servlet + mysql 三层架构实现的网上书店系统.zip

    移动应用与物联网(IoT):作为数据存储层,支撑大量设备的数据采集、存储和查询需求。 嵌入式系统:在资源有限的环境中,作为轻量级数据库解决方案。 总之,MySQL凭借其开源、跨平台、高性能、灵活扩展、丰富...

    电影推荐系统:SpringBoot、vue,基于物品的协同过滤算法,IDEA,WebStorm,mysql.zip

    移动应用与物联网(IoT):作为数据存储层,支撑大量设备的数据采集、存储和查询需求。 嵌入式系统:在资源有限的环境中,作为轻量级数据库解决方案。 总之,MySQL凭借其开源、跨平台、高性能、灵活扩展、丰富...

    基于Flask + MySQL的在线请假微信小程序.zip

    移动应用与物联网(IoT):作为数据存储层,支撑大量设备的数据采集、存储和查询需求。 嵌入式系统:在资源有限的环境中,作为轻量级数据库解决方案。 总之,MySQL凭借其开源、跨平台、高性能、灵活扩展、丰富...

    该系统是基于Activiti5工作流引擎采用了SSM+Mysql实现的一个学生请假系统.zip

    移动应用与物联网(IoT):作为数据存储层,支撑大量设备的数据采集、存储和查询需求。 嵌入式系统:在资源有限的环境中,作为轻量级数据库解决方案。 总之,MySQL凭借其开源、跨平台、高性能、灵活扩展、丰富...

    基于Jsp+Servlet+MySQL的会员管理系统.zip

    移动应用与物联网(IoT):作为数据存储层,支撑大量设备的数据采集、存储和查询需求。 嵌入式系统:在资源有限的环境中,作为轻量级数据库解决方案。 总之,MySQL凭借其开源、跨平台、高性能、灵活扩展、丰富...

    基于C#试题库管理系统(MySQL).zip

    移动应用与物联网(IoT):作为数据存储层,支撑大量设备的数据采集、存储和查询需求。 嵌入式系统:在资源有限的环境中,作为轻量级数据库解决方案。 总之,MySQL凭借其开源、跨平台、高性能、灵活扩展、丰富...

    基于Java Swing + MySQL的图书管理系统.zip

    移动应用与物联网(IoT):作为数据存储层,支撑大量设备的数据采集、存储和查询需求。 嵌入式系统:在资源有限的环境中,作为轻量级数据库解决方案。 总之,MySQL凭借其开源、跨平台、高性能、灵活扩展、丰富...

Global site tag (gtag.js) - Google Analytics