`
LJ你是唯一LT
  • 浏览: 238634 次
社区版块
存档分类
最新评论

oracle插入大量数据

阅读更多
oracle插入大量数据

1.生成大量的随机测试数据
create table mytest as 
select rownum as id, 
               to_char(sysdate + rownum/24/3600, 'yyyy-mm-dd hh24:mi:ss') as ins_time, 
               trunc(dbms_random.value(0, 100)) as random_id, 
               dbms_random.string('x', 20) random_string 
          from dual 
        connect by level <= 10000; 
 
SQL> col RANDOM_STRING for a30
SQL> select * from mytest where ROWNUM <5;

ID INS_TIME                 RANDOM_ID RANDOM_STRING
---------- ------------------- ---------- ------------------------------
1 2015-12-23 16:37:49        31       DFJXXVY82FH5FZBLRQGG
2 2015-12-23 16:37:50        54       PJXQG3QNYI3K7NXTCQS2
3 2015-12-23 16:37:51        86       B3RWA8H1VH3683WMNLUH
4 2015-12-23 16:37:52        34       MN438B2ETLSJBLT57IY7

1、利用Oracle特有的“connect by”树形连接语法生成测试记录,“level <= 10”表示要生成10记录;
2、利用rownum虚拟列生成递增的整数数据;
3、利用sysdate函数加一些简单运算来生成日期数据,本例中是每条记录的时间加1秒;
4、利用dbms_random.value函数生成随机的数值型数据,本例中是生成0到100之间的随机整数;
5、利用dbms_random.string函数生成随机的字符型数据,本例中是生成长度为20的随机字符串,字符串中可以包括字符或数字。

create table ta as
select  rownum as id, dbms_random.string ('x', 20) name  from dual  connect by level <= 100000; 

SQL> col name for a30
SQL>select * from ta where rownum<10

ID NAME
---------- ------------------------------
1 DLM4OQ0RDZ6HNHKTJTDG
2 BA1TCAPE5WT1O03TKKKE
3 4A4W1JBJHFCOUQIQWCIU
4 MTT1Z9B8247N3HCDTDDU
5 Q22ZNBSLCLN7EEG4JF44
6 NJ7KXP1N3VKNELT95LMC
7 VYFGIORNXHHHWKFOR4NQ
8 7C8R7HGKZ3GEEKK67Z7V
9 6I50G0C6PH0DYV32GW0I

9 rows selected.

2.如何快速插入:
SQL> set timing on
SQL> create table tb(id int,name varchar2(20));
SQL> insert into tb select * from ta;
100000 rows created.
Elapsed: 00:00:00.86

使用hint缩短插入时间                                                                                                                                                    
SQL> insert /*+Append*/ into tb select * from ta;
100000 rows created.
Elapsed: 00:00:00.13    

3.如何批量提交:
1)模拟逐行提交效率(ta表有10w行数据,tb表为空)
DECLARE
BEGIN
   FOR cur IN (SELECT * FROM ta) LOOP
     INSERT INTO tb VALUES cur;
     COMMIT;
   END LOOP;
END;
/
PL/SQL procedure successfully completed.

Elapsed: 00:00:16.38   --16s的时间

2)模拟批量提交效率(ta表有10w行数据,tb表为空)
truncate table tb;

DECLARE
  v_count NUMBER;
BEGIN
  FOR cur IN (SELECT * FROM ta) LOOP
    INSERT INTO tb VALUES cur;
    v_count := v_count + 1;
    IF v_count >= 1000 THEN
      COMMIT;
    END IF;
  END LOOP;
  COMMIT;
END;
/

PL/SQL procedure successfully completed.

Elapsed: 00:00:07.89  ---7s的时间

数据量小的时候,差别可能不大,但数据量大的时候,就能明显看到区别了。

3)另一种高速提交的方法(使用游标)
DECLARE
    CURSOR cur IS
      SELECT * FROM ta;
    TYPE rec IS TABLE OF ta%ROWTYPE;
    recs rec;
  BEGIN
    OPEN cur;
    WHILE (TRUE) LOOP
      FETCH cur BULK COLLECT
        INTO recs LIMIT 100;
      FORALL i IN 1 .. recs.COUNT
        INSERT INTO tb VALUES recs (i);
      COMMIT;
      EXIT WHEN cur%NOTFOUND;
    END LOOP;
    CLOSE cur;
  END;
  /

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.62  ---1s的时间都不要

说明:频繁的COMMIT会引起大量Redo Log的物理I/O,会极大的限制数据库的性能。因此,为提高数据库性能,尽可能的批量提交。
分享到:
评论

相关推荐

    Oracle插入大量数据

    描述了在Oracle中若需要插入大量数据,可以采用的方法。

    oracle 批量插入数据存储过程

    oracle 批量插入数据存储过程。亲测好用。支持 plsql ,toad,等数据库分析软件。主要包括变量的定义,循环及游标的使用等, 亲测好用

    Oracle表删除大量数据(千万)后查询变慢问题(原因分析)

    Oracle表删除大量数据(千万)后查询变慢问题(原因分析)

    oracle批量插入测试数据

    数据库做数据库开发或管理的人经常要创建大量的测试数据,动不动就需要上万条,如果一条一条的录入,那会浪费大量的时间,本文介绍了Oracle中如何通过一条 SQL快速生成大量的测试数据的方法。 产生测试数据的SQL如下...

    java代码oracle数据库批量插入

    在oracle数据据库中批量插入数据的java方法

    C++Oracle存储过程批量插入

    可以参看博客:http://blog.csdn.net/fengshuiyue/article/details/38988725

    如何快速转移Oracle中海量数据

    如果要把Oracle里的大量数据(80MB以上)转移到另外的用户,另外的表空间里。可以用本文介绍的快速转移数据的方法。建新表的方式,直接插入的方。这两种方法转移数据时没有用SGA里数据缓冲区和事物处理的回滚段, 也不...

    plsql批量导入数据

    plsql批量导入数据

    excel批量导入oracle数据库

    这段代码主要实现的是将excel里面的大量数据一次性批量导入Oracle数据库内。

    Oracle11g从入门到精通2

    7.4 避免更改引起的大量改动 7.4.1 使用视图 7.4.2 使用同义名 7.4.3 使用光标 第8章 数据库用户管理 8.1 授予权限 8.1.1 直接授权 8.1.2 授权角色 8.1.3 使用OEM的“安全管理”创建 角色 ...

    PostgreSQL多表插入(兼容oracle insert all)

    例如,希望把A表的数据分别插入到 B 表、C 表和 D 表。这3个表与 A 表的结构相同(相同的列和数据类型),并且当前不含任何数据。 解决办法就是把查询结果插入到多个目标表中。在oracle中我们可以使用insert all或者...

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

    有近20年使用Oracle技术产品以及Oracle数据库管理员/Oracle数据库应用管理员的经验,是真正应用集群、性能调优以及数据库内部属性方面的专家。同时是一位演讲家及Oracle ACE。  JARED STILL 从1994年就开始使用...

    Oracle11g从入门到精通

    7.4 避免更改引起的大量改动 7.4.1 使用视图 7.4.2 使用同义名 7.4.3 使用光标 第8章 数据库用户管理 8.1 授予权限 8.1.1 直接授权 8.1.2 授权角色 8.1.3 使用OEM的“安全管理”创建 角色 8.1.4 使用...

    ORACLE9i_优化设计与系统调整

    §1.1.1 Oracle数据字典 23 §1.1.2 表空间与数据文件 24 §1.1.3 Oracle实例(Instance) 24 §1.2 Oracle文件 26 §1.2.1 数据文件 26 §1.2.2 控制文件 26 §1.2.3 重做日志文件 26 §1.2.4 其它支持文件 26 §...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    其三、职业方向多:Oracle数据库管理方向、Oracle开发及系统架构方向、Oracle数据建模数据仓库等方向。 四、 如何学习 认真听课、多思考问题、多动手操作、有问题一定要问、多参与讨论、多帮组同学 五、 体系结构 ...

    Oracle.11g.从入门到精通 (2/2)

    7.4 避免更改引起的大量改动 7.4.1 使用视图 7.4.2 使用同义名 7.4.3 使用光标 第8章 数据库用户管理 8.1 授予权限 8.1.1 直接授权 8.1.2 授权角色 8.1.3 使用OEM的“安全管理”创建 角色 8.1.4 使用ALTERUSER语句...

    Oracle8i_9i数据库基础

    §1.7 ORACLE数据类型 38 §1.8 SQL 语句基础 44 §1.8.1 SQL语句所用符号 44 §1.8.2 简单select 查询 45 §1.9 伪列及伪表 46 §1.10 使用SQL Worksheet工作 46 第二章 查询基础 50 §2.1 SELECT语句 50 §2.2 SQL...

    Oracle.11g.从入门到精通 (1/2)

    7.4 避免更改引起的大量改动 7.4.1 使用视图 7.4.2 使用同义名 7.4.3 使用光标 第8章 数据库用户管理 8.1 授予权限 8.1.1 直接授权 8.1.2 授权角色 8.1.3 使用OEM的“安全管理”创建 角色 8.1.4 使用ALTERUSER语句...

    Oracle数据库中分区表的操作方法详解

    虽然存储介质和数据处理技术的发展也很快,但是仍然不能满足用户的需求,为了使用户的大量的数据在读写操作和查询中速度更 快,Oracle提供了对表和索引进行分区的技术,以改善大型应用系统的性能。在大量业务数据...

Global site tag (gtag.js) - Google Analytics