用笛卡尔积来创建一千六百万大表 整体19分钟 大表建成两分钟 设置id13分钟
本文精简版:https://www.cnblogs.com/heyang78/p/15239683.html
昨天拙文中讲述了用自增方式创建一千六百万大表的方案,这回讨论的是用笛卡儿积,实践证明这种方案更快.
2020年3月15日08点58分实验开始
创建仅有四千数据的tb_4thousand1表:
SQL> CREATE TABLE tb_4thousand1 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.12
给这张表充值:
SQL> insert into tb_4thousand1 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<=4000 8 order by dbms_random.random; 已创建4000行。 已用时间: 00: 00: 00.48
再创建一张同构的表tb_4thousand2
SQL> CREATE TABLE tb_4thousand2 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 ) 8 ; 表已创建。 已用时间: 00: 00: 00.01
给这张表充值:
SQL> insert into tb_4thousand2 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<=4000 8 order by dbms_random.random; 已创建4000行。 已用时间: 00: 00: 00.18
然后看看tb_4thousand1和tb_4thousand2表的笛卡儿积有多少数据:
SQL> select count(*) from (select t1.* from tb_4thousand1 t1 cross join tb_4thousand2 t2); COUNT(*) ---------- 16000000 已用时间: 00: 00: 00.56
一千六百万,这就是我们想要的,下面开始建表:
SQL> create table tb_16million2 as select t1.* from tb_4thousand1 t1 cross join tb_4thousand2 t2; 表已创建。 已用时间: 00: 00: 21.52
至此,实验时间为2020年3月15日09点00分,也就是说我们用两分钟就创建了一张一千六百万大表!
当然,这张表的id字段需要规整一下:
SQL> update tb_16million2 set id=rownum where 1=1; 已更新16000000行。 已用时间: 00: 13: 06.69
短短的更新语句,跑出了13分钟,真是个漫长的等待!看来需要一条条设置数据的sql就是耗时的。
最后给tb_16million2表设上主键:
SQL> ALTER TABLE tb_16million2 ADD CONSTRAINT tb_16million2_pk PRIMARY KEY (id); 表已更改。 已用时间: 00: 00: 40.60
至此实验结束,时间为2020年3月15日09点17分,其中13分钟是放在update语句上了。
好了,我们又多了一种创建大表的选择,那就是利用笛卡儿积,两分钟建成一千六百万大表的速度确实可以让人兴奋一把。
下面是上文提到的所有sql:
CREATE TABLE tb_4thousand1 ( id NUMBER not null primary key, name NVARCHAR2(60) not null, salary int NOT NULL, createtime TIMESTAMP (6) not null ) insert into tb_4thousand1 select rownum, dbms_random.string('*',dbms_random.value(6,20)), dbms_random.value(1000,50000), sysdate from dual connect by level<=4000 order by dbms_random.random CREATE TABLE tb_4thousand2 ( id NUMBER not null primary key, name NVARCHAR2(60) not null, salary int NOT NULL, createtime TIMESTAMP (6) not null ) insert into tb_4thousand2 select rownum, dbms_random.string('*',dbms_random.value(6,20)), dbms_random.value(1000,50000), sysdate from dual connect by level<=4000 order by dbms_random.random select count(*) from (select t1.* from tb_4thousand1 t1 cross join tb_4thousand2 t2) create table tb_16million2 as select t1.* from tb_4thousand1 t1 cross join tb_4thousand2 t2 update tb_16million2 set id=rownum where 1=1; ALTER TABLE tb_16million2 ADD CONSTRAINT tb_16million2_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月15日--
分类:
Oracle.千万级表
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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-15 【Canvas与艺术】淡蓝辉光汽车速度仪表盘
2019-03-15 [JS]常见JS错误之一:Uncaught SyntaxError: Unexpected identifier