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

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

 

posted @   逆火狂飙  阅读(1365)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
生当作人杰 死亦为鬼雄 至今思项羽 不肯过江东
点击右上角即可分享
微信分享提示