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