修改一张一千六百万数据的大表一个字段的名称需要多长时间?
有一张一千六百万数据的大表包含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日--