• 【Oracle】如何快速创建一千六百万大表


    【数据库版本】Oracle11g

    【硬件】Thinkpadt440p

    以下是详细步骤,其中主键规整设定两步可以按需求调整。

    【建初始表 秒出】

    create table emp_init(
        id number(12),
        name varchar2(20),
        age number(3),
        salary number(6),
        create_time timestamp default sysdate,
        remark nvarchar2(100),
    primary key(id))

    【初始表充值 秒出】

    insert into emp_init
        select rownum,
                dbms_random.string('*',dbms_random.value(6,20)),
                dbms_random.value(18,65),
                dbms_random.value(1000,50000),
                sysdate,
            dbms_random.string('*',dbms_random.value(10,100))
        from dual
        connect by level<4001

    【以初始表为基础创建辅助表 秒出】

    CREATE TABLE emp_bk as select * from emp_init;

    【利用笛卡儿积生成一千六百万大表 耗时一分钟】

    create table emp_final as select a.* from emp_init a cross join emp_bk b;

    至此的步骤耗时不多,往下就进入了耗时环节。 

    注意,如果不用这种方式,而直接采用connect by level<16000001的话,会遇到ORA-30009:connect by 操作内存不足的错误。

    【规整主键 耗时约26分钟】

    update emp_final set id=rownum where 1=1;

     【设定主键 耗时约两分钟】

    ALTER TABLE emp_final ADD CONSTRAINT emp_final_pk PRIMARY KEY (id);

     一千六百万大表至此创建完毕,整体耗时约半小时。

    以下是完整记录:

    SQL> create table emp_init(
      2  id number(12),
      3  name varchar2(20),
      4  age number(3),
      5  salary number(6),
      6  create_time timestamp default sysdate,
      7  remark nvarchar2(100),
      8  primary key(id));
    
    表已创建。
    
    已用时间:  00: 00: 00.01
    SQL> insert into emp_init
      2      select rownum,
      3              dbms_random.string('*',dbms_random.value(6,20)),
      4              dbms_random.value(18,65),
      5              dbms_random.value(1000,50000),
      6              sysdate,
      7      dbms_random.string('*',dbms_random.value(10,100))
      8      from dual
      9      connect by level<4001;
    
    已创建4000行。
    
    已用时间:  00: 00: 00.28
    SQL> CREATE TABLE emp_bk as select * from emp_init;
    
    表已创建。
    
    已用时间:  00: 00: 00.03
    SQL> create table emp_final as select a.* from emp_init a cross join emp_bk b;
    
    表已创建。
    
    已用时间:  00: 00: 58.88
    SQL> update emp_final set id=rownum where 1=1;
    
    已更新16000000行。
    
    已用时间:  00: 26: 20.31
    SQL> ALTER TABLE emp_final ADD CONSTRAINT emp_final_pk PRIMARY KEY (id);
    
    表已更改。
    
    已用时间:  00: 01: 45.80
    SQL>

    END

  • 相关阅读:
    TDD
    算法与数据结构 文档 1 洋洋洋传
    编程的专精度
    python小课
    有时心情舒畅时打个代码心里都是默默地同步输出...
    同时可以运行在JVM上的Kotlin~枚举和判定以及数据对象的写法总结
    map
    multiset
    set
    priority_queue
  • 原文地址:https://www.cnblogs.com/heyang78/p/15983381.html
Copyright © 2020-2023  润新知