25分钟创建一千六百万大表全记录

2020年3月14日19点16分开始

创建两百万中间表:

复制代码
SQL> CREATE TABLE tb_2million
  2  (
  3      id NUMBER not null primary key,
  4      name NVARCHAR2(60) not null,
  5      salary int NOT NULL,
  6      createtime TIMESTAMP (6) not null
  7  );

表已创建。

已用时间:  00: 00: 00.18
复制代码

给两百万中间表充值:

复制代码
SQL> insert into tb_2million
  2  select rownum,
  3          dbms_random.string('*',dbms_random.value(6,20)),
  4          dbms_random.value(1000,50000),
  5  sysdate
  6  from dual
  7  connect by level<=2000000
  8  order by dbms_random.random;

已创建2000000行。

已用时间:  00: 03: 09.16
复制代码

提交一次:

SQL> commit;

提交完成。

已用时间:  00: 00: 00.01

接下来以两百万中间表作为大表的基础:

SQL> create table tb_16million as select * from tb_2million;

表已创建。

已用时间:  00: 00: 05.89

然后往自身插值三次:

复制代码
SQL> insert into tb_16million select * from tb_16million;

已创建2000000行。

已用时间:  00: 00: 46.96
SQL> insert into tb_16million select * from tb_16million;

已创建4000000行。

已用时间:  00: 00: 34.35
SQL> insert into tb_16million select * from tb_16million;

已创建8000000行。

已用时间:  00: 01: 08.59
复制代码

看看有多少数据:

SQL> select count(*) from tb_16million;

  COUNT(*)
----------
  16000000

已用时间:  00: 00: 06.67

再次提交:

SQL> commit;

提交完成。

已用时间:  00: 00: 00.01

至此为19点25分,可以说一千六百万数据表已经建成,用时9分钟。但剩下还有一部分任务需要做,那就是设上主键。

由于我们反复插值,导致大表id部分是重复的,我们需要把它整理成递增序列.

SQL> update tb_16million set id=rownum where 1=1;

已更新16000000行。

已用时间:  00: 13: 27.04

用时十三分钟,这比前面反复建表都长。

再次提交:

SQL> commit;

提交完成。

已用时间:  00: 00: 00.00

最后设上主键:

SQL> ALTER TABLE tb_16million ADD CONSTRAINT tb_16million_pk PRIMARY KEY (id);

表已更改。

已用时间:  00: 00: 39.54

至此为19点41分,总计用时25分。

从上面语句耗时情况看,最为耗时的是一条一条去设置值,典型代表是上面给两百万中间表充值和更新大表id字段;其次耗时的是批量数据的拷贝,典型代表是tb_16million自身往自身插值,与前面相比它耗时已经少很多了;再次为查询数量,与前两者相比已经很少了;至于设主键,提交,之类,耗时几乎可以忽略不计。

这便是一个一千六百万大表的创建过程,全部sql语句如下:

复制代码
CREATE TABLE tb_2million
(
    id NUMBER not null primary key,
    name NVARCHAR2(60) not null,
    salary int NOT NULL,
    createtime TIMESTAMP (6) not null
)

insert into tb_2million
select rownum,
        dbms_random.string('*',dbms_random.value(6,20)),
        dbms_random.value(1000,50000),
    sysdate
from dual
connect by level<=2000000
order by dbms_random.random

create table tb_16million as select * from tb_2million;

insert into tb_16million select * from tb_16million;  --4m--
insert into tb_16million select * from tb_16million;  --8m--
insert into tb_16million select * from tb_16million;  --16m--

select count(*) from tb_16million;

update tb_16million set id=rownum where 1=1;

ALTER TABLE tb_16million ADD CONSTRAINT tb_16million_pk PRIMARY KEY (id);
复制代码

我的环境:

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

没有实际经验支撑的理念是空洞和经不起推敲的,所以工程师需要反复实验以接近真理。

--2020年3月14日--

posted @   逆火狂飙  阅读(204)  评论(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)
历史上的今天:
2019-03-14 【Canvas与艺术】黑底蓝绿色网格雷达之眼
生当作人杰 死亦为鬼雄 至今思项羽 不肯过江东
点击右上角即可分享
微信分享提示