zoukankan      html  css  js  c++  java
  • 在Oracle中十分钟内创建一张千万级别的表

    小表不会产生性能问题,大表才会。要练习SQL调优,还非得有大表不可。但数据不会自然产生,没有数据时如何创建一张千万级别的大表呢?

    之前,我想用Oracle的批量插入语法去插入数据,此语法如下:

    INSERT ALL 
       INTO firsttb(NAME, age,createdtime) values('E1','22',sysdate)
       INTO firsttb(NAME, age,createdtime) values('E2','32',sysdate)
       INTO firsttb(NAME, age,createdtime) values('E3','42',sysdate)
       ...
       INTO firsttb(NAME, age,createdtime) values('E250','42',sysdate)
    select * from dual

    通过Java程序,可以把Insert all 和 select * from dual 之间插入大批数据,然后一次性送给数据库去执行。

    但是,这种方法是有限制的,在我的T440p机器上,Insert all 和 select * from dual 之间大约就能插250行左右,那么提交一千条数据需要四次IO。

    而百万级插入需要十分钟,千万级就到了一个小时...太耽误事了,因此我只得寻求其它方案。

    后来,我想出了以下步骤供大家参考:

    先创建一张基础表,这张表结构应与你最终想建的表一致:

    CREATE TABLE HY_million
    (
        id NUMBER not null primary key,
        name NVARCHAR2(60) not null,
        score NUMBER(4,0) NOT NULL,
        createtime TIMESTAMP (6) not null
    )

    然后往这张表里插入两百万数据:

     Insert into HY_million
     select rownum,dbms_random.string('*',dbms_random.value(6,20)),dbms_random.value(0,20),sysdate from dual
     connect by level<=2000000
     order by dbms_random.random

    注意200,0000这个值是根据机器来的,性能好的可以调大,说不定可以直接创建出千万数据,那么下面的步骤就省了,如果你不幸和我一样机器性能受限,那么还得继续下面的步骤。

    先commit一次,接下来连表结构带数据创建目标表:

     create table hy_million2 as select * from HY_million

    查一下hy_million2有多少数据:

     select count(*) from hy_million2

    发现是两百万,目前这个表结构和HY_million是一样的,但没有约束,这正适合往里插入数据。

    将以下语句执行四遍。

     insert into hy_million2 select * from HY_million

    执行完成hy_million2就有一千万数据了。

    再执行下面语句把id规整一下:

    update hy_million2 set id=rownum where 1=1

    再看看规整得怎么样:

     select count(distinct id) from hy_million2

    不出意外的话,结果应该是一千万。

    然后再次commit。

    最后给表设上主键:

     ALTER TABLE hy_million2 ADD CONSTRAINT constraint_million2 PRIMARY KEY (id);

    之后,就可以开始使用这张千万级别的表了。

    我的执行记录:

    Table HY_MILLION created.
    
    
    2,000,000 rows inserted.
    
    
    Commit complete.
    
    
    Table HY_MILLION2 created.
    
    
    Commit complete.
    
    
    2,000,000 rows inserted.
    
    
    2,000,000 rows inserted.
    
    
    2,000,000 rows inserted.
    
    
    2,000,000 rows inserted.
    
    
    10,000,000 rows updated.
    
    
    Commit complete.
    
    
    Table HY_MILLION2 altered.

    我总的执行时间十分钟不到,你应该能做得更好。

    参考资料:

    https://blog.csdn.net/paullinjie/article/details/80615295

    附:MySQL批量插入语法

    Mysql batch-insert grammar:
    insert into emp(name,age,cdate)
    values
    ('A' , 20, '2019-10-13 00:00:00'),
    ('B' , 21, '2019-10-13 01:00:00'),
    ('C' , 22, '2019-10-13 05:00:00')

    MySql批量插入远比Oracle快,采用这种语法仅用程序就可以达到高速,具体实验请看:

    https://www.cnblogs.com/xiandedanteng/p/11666743.html

    --END-- 2020-01-09 09:51

  • 相关阅读:
    2018.9.22 Bubble Cup 11-Finals(Online Mirror,Div.2)
    2018.9.21 Codeforces Round #511(Div.2)
    2018.9.20 Educational Codeforces Round 51
    解题:USACO12OPEN Bookshelf
    解题:CF983B pyramid
    1214. 许可证密钥格式
    1212. 最大连续1的个数
    1270. 勒索信
    1250. 第三大的数
    1218. 补数
  • 原文地址:https://www.cnblogs.com/heyang78/p/12169527.html
Copyright © 2011-2022 走看看