• 修改一张一千六百万数据的大表一个字段的名称需要多长时间?


    有一张一千六百万数据的大表包含id,name,sal三个字段,字段类型如下:

    id number(9,0) primary key,
    name nvarchar2(20),
    sal number(5,0)

    查一下看看数据多少:

    SQL> select count(*) from tb_qianwan_final;
    
      COUNT(*)
    ----------
      16000000
    
    已用时间:  00: 00: 02.25

    现在要修改字段sal为salary,看究竟需要多长时间,得到时间是为了看会锁表多久。

    修改字段名语句:

    alter table tb_qianwan_final rename column sal to salary;

    时间:

    SQL> alter table tb_qianwan_final rename column sal to salary;
    
    表已更改。
    
    已用时间:  00: 00: 00.14

    0.14秒,少得很,看来对锁表时间无须太顾虑。

    PS:修改字段到兼容的类型也挺快的:

    SQL> alter table tb_qianwan_final modify (salary number(6,0));
    
    表已更改。
    
    已用时间:  00: 00: 00.00

    正文到这里就结束了,如果想知道做实验的一千六百万数据的大表是怎么弄出来的,可以继续往下看:

    首先创建一张中间表:

    create table tb_qianwan(
        id number(9,0) primary key,
        name nvarchar2(20),
        sal number(5,0)
    )
    SQL> create table tb_qianwan(
      2      id number(9,0) primary key,
      3  name nvarchar2(20),
      4  sal number(5,0)
      5  );
    
    表已创建。

    然后给它充值两百万:

    insert into tb_qianwan
    select rownum,
            dbms_random.string('*',dbms_random.value(6,20)),
            dbms_random.value(1000,30000)
    from dual
    connect by level<=2000000
    order by dbms_random.random
    SQL> insert into tb_qianwan
      2  select rownum,
      3          dbms_random.string('*',dbms_random.value(6,20)),
      4  dbms_random.value(1000,30000)
      5  from dual
      6  connect by level<=2000000
      7  order by dbms_random.random;
    
    已创建2000000行。
    
    SQL> commit;
    
    提交完成。

    然后以此为蓝本创立最终表:

    create table tb_qianwan_final as select * from tb_qianwan;
    SQL> create table tb_qianwan_final as select * from tb_qianwan;
    
    表已创建。
    
    已用时间:  00: 00: 01.01

    然后从自身取值往自身插值,这样数据增长是几何级数提高的,比 https://blog.csdn.net/River_Sun/article/details/103942914 里线性增加的方案要快。

    SQL> insert into tb_qianwan_final select * from tb_qianwan_final;
    
    已创建2000000行。
    
    已用时间:  00: 00: 24.66
    SQL> insert into tb_qianwan_final select * from tb_qianwan_final;
    
    已创建4000000行。
    
    已用时间:  00: 00: 18.20
    SQL> select count(*) from tb_qianwan_final;
    
      COUNT(*)
    ----------
       8000000
    
    已用时间:  00: 00: 01.15
    SQL> insert into tb_qianwan_final select * from tb_qianwan_final;
    
    已创建8000000行。
    
    已用时间:  00: 00: 41.49
    SQL> select count(*) from tb_qianwan_final;
    
      COUNT(*)
    ----------
      16000000
    
    已用时间:  00: 00: 03.35
    SQL> commit;
    
    提交完成。

    然后给主键加上,并且设置值:

    SQL> update tb_qianwan_final set id=rownum where 1=1;
    
    已更新16000000行。
    
    已用时间:  00: 10: 10.19
    SQL> commit;
    
    提交完成。
    
    已用时间:  00: 00: 00.00

      SQL> ALTER TABLE tb_qianwan_final ADD CONSTRAINT tb_qianwan_final_pk PRIMARY KEY (id);

    
    

      表已更改。

    
    

      已用时间: 00: 00: 32.42

     

    这样以后,一千六百万的大表就在二十分钟内创建出来了。已经足够用来做实验的了。

    我的环境:

    # 类别 版本
    1 操作系统 Win10
    2 数据库 Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
    3 硬件环境 T440p
    4 内存 8G

    --2020年2月16日--

  • 相关阅读:
    软件开发模版与规范 & 项目组规范
    CSS代码结构初探
    DIV+CSS 一行两列布局
    AE 9.3代码 升级到AE10.0
    栅格相减 异常
    鹰眼视图异常
    十进制度批量转换度分秒
    javascript是一朵奇葩
    pku 1065 pku 1548
    hdu 1254 推箱子
  • 原文地址:https://www.cnblogs.com/heyang78/p/12316854.html
Copyright © 2020-2023  润新知