用笛卡尔积来创建一千六百万大表 整体19分钟 大表建成两分钟 设置id13分钟
昨天拙文中讲述了用自增方式创建一千六百万大表的方案,这回讨论的是用笛卡儿积,实践证明这种方案更快.
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日--
用笛卡尔积来创建一千六百万大表 整体19分钟 大表建成两分钟 设置id13分钟的更多相关文章
- MySQL数据库 crud语句 ifnull() 创建新账户 备份数据库 一对多关系 多对多(中间表) 外键约束 自关联 子查询注意事项 DML DDL DQL mysql面试题 truncate与delete的区别
DML(data manipulation language): 它们是SELECT.UPDATE.INSERT.DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言 DDL ...
- SQL语句创建数据库,SQL语句删除数据库,SQL语句创建表,SQL语句删除表,SQL语句添加约束,SQL语句删除约束
创建数据库: CREATE DATABASE Test --要创建的数据库名称 ON PRIMARY ( --数据库文件的具体描述 NAME='Test_data', --主数据文件的逻辑名称 FIL ...
- oracle创建表空间、创建用户、授权、夺权、删除用户、删除表空间
表空间定义 表空间是为了统一ORACLE物理和逻辑上的结构而专门建立的,从物理上来说,一个表空间是由具体的一个或多个磁盘上数据文件构成的(至少1对1,可以1对多),从逻辑上来说一个表空间是由具体的一个 ...
- 实验测试之------创建DBlink,查询远端的yang用户下的abcdedfa表,创建同义词
--测试环境,20远端,30本地: --准备1,20远端建立表的同义词,用户信息: 1.11 ---------------------------------------------------准备 ...
- 5.创建表,使用alter进行表信息的增删改,Oracle回收站,集合运算
1 Oracle基于用户的管理方案 2 DDL语句可以管理数据库的对象有:视图 索引 序列 同义词 约束 3 创建一个表,有2个条件(1 有权限:2有表空间) Oracle给你提 ...
- Angular4.x 创建组件|绑定数据|绑定属性|数据循环|条件判断|事件|表单处理|双向数据绑定
Angular4.x 创建组件|绑定数据|绑定属性|数据循环|条件判断|事件|表单处理|双向数据绑定 创建 angular 组件 https://github.com/angular/angular- ...
- REQUIRES_NEW 如果不在一个事务那么自己创建一个事务 如果在一个事务中 自己在这个大事务里面在创建一个子事务 相当于嵌套事务 双层循环那种
REQUIRES_NEW 如果不在一个事务那么自己创建一个事务 如果在一个事务中 自己在这个大事务里面在创建一个子事务 相当于嵌套事务 双层循环那种 不管是否存在事务,业务方法总会自己开启一个事 ...
- 第三百七十四节,Django+Xadmin打造上线标准的在线教育平台—创建课程app,在models.py文件生成4张表,课程表、课程章节表、课程视频表、课程资源表
第三百七十四节,Django+Xadmin打造上线标准的在线教育平台—创建课程app,在models.py文件生成4张表,课程表.课程章节表.课程视频表.课程资源表 创建名称为app_courses的 ...
- 第三百七十三节,Django+Xadmin打造上线标准的在线教育平台—创建用户app,在models.py文件生成3张表,用户表、验证码表、轮播图表
第三百七十三节,Django+Xadmin打造上线标准的在线教育平台—创建用户app,在models.py文件生成3张表,用户表.验证码表.轮播图表 创建Django项目 项目 settings.py ...
随机推荐
- Java连接Redis,存储对象获取对象()byte和json),连接池
Java连接Redis Jedis连接Redis,Lettuce连接Redis Jedis连接Redis 1. 创建maven项目 2. 引入依赖 <dependencies> <d ...
- SSH config语法关键字
1.SSH config 语法关键字 host 别名 HostName 主机名(ip) User 用户(root就是一个用户) Port 端口(默认22) IdentityFile 密钥文件的路 ...
- Linux探测工具BCC(可观测性)
BCC(可观测性) 目录 BCC(可观测性) 简介 动机 版本要求 安装 安装依赖 安装和编译LLVM 安装和编译BCC windows源码查看 BCC的基本使用 工具讲解 execsnoop ope ...
- C++中简单程序出现Segmentation fault (core dumped)段错误
段错误就是指访问的内存超出了系统所给这个程序的内存空间.一般是随意使用野指针或者数组.数组越界. ------两种简单解决方法:1.利用GDB调试,定位出错位置.(具体可查找博客详细学习)2.在可能出 ...
- C#LeetCode刷题之#724-寻找数组的中心索引( Find Pivot Index)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3742 访问. 给定一个整数类型的数组 nums,请编写一个能够返 ...
- centos环境 使用kubeadm快速安装k8s集群v1.16.2
全程使用root用户运行,宿主机需要连接外网 浏览一下官方kubeadm[有些镜像用不了] https://kubernetes.io/docs/setup/production-environmen ...
- Xor 思维题
Xor 思维题 题目描述 小\(Q\)与小\(T\)正在玩一棵树.这棵树有\(n\)个节点,编号为 \(1\),\(2\) \(3...n\),由\(n-1\)条边连接,每个节点有一个权值\(w_i\ ...
- Debug很重要
之前做一个小功能,就是用php发送邮件,项目中已经使用了wordpress的wp_mail,所以同事建议我继续用wp_mail函数. 然而遇到了一个奇怪的情况,邮件没有发出去,也没有任何报错日志. 照 ...
- (转载)sqlserver2008”备份集中的数据库备份与现有的XX数据库不同”解决办法
原文链接:https://www.cnblogs.com/huangfr/archive/2012/08/09/2629687.html 因为是在另一台电脑对同名数据库做的备份,用常规方法还原,提示不 ...
- 笔记:Ubuntu安装LAMP环境
一.更换Ubuntu的镜像源 镜像源路径:/etc/apt/sources.list 备份:cp /etc/apt/sources.list /etc/apt/souces.list.bak 使用阿里 ...