有一张一千六百万数据的大表包含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日--