昨天拙文中讲述了用自增方式创建一千六百万大表的方案,这回讨论的是用笛卡儿积,实践证明这种方案更快.

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分钟的更多相关文章

  1. MySQL数据库 crud语句 ifnull() 创建新账户 备份数据库 一对多关系 多对多(中间表) 外键约束 自关联 子查询注意事项 DML DDL DQL mysql面试题 truncate与delete的区别

    DML(data manipulation language): 它们是SELECT.UPDATE.INSERT.DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言 DDL ...

  2. SQL语句创建数据库,SQL语句删除数据库,SQL语句创建表,SQL语句删除表,SQL语句添加约束,SQL语句删除约束

    创建数据库: CREATE DATABASE Test --要创建的数据库名称 ON PRIMARY ( --数据库文件的具体描述 NAME='Test_data', --主数据文件的逻辑名称 FIL ...

  3. oracle创建表空间、创建用户、授权、夺权、删除用户、删除表空间

    表空间定义 表空间是为了统一ORACLE物理和逻辑上的结构而专门建立的,从物理上来说,一个表空间是由具体的一个或多个磁盘上数据文件构成的(至少1对1,可以1对多),从逻辑上来说一个表空间是由具体的一个 ...

  4. 实验测试之------创建DBlink,查询远端的yang用户下的abcdedfa表,创建同义词

    --测试环境,20远端,30本地: --准备1,20远端建立表的同义词,用户信息: 1.11 ---------------------------------------------------准备 ...

  5. 5.创建表,使用alter进行表信息的增删改,Oracle回收站,集合运算

     1  Oracle基于用户的管理方案 2 DDL语句可以管理数据库的对象有:视图   索引  序列  同义词   约束 3  创建一个表,有2个条件(1 有权限:2有表空间) Oracle给你提 ...

  6. Angular4.x 创建组件|绑定数据|绑定属性|数据循环|条件判断|事件|表单处理|双向数据绑定

    Angular4.x 创建组件|绑定数据|绑定属性|数据循环|条件判断|事件|表单处理|双向数据绑定 创建 angular 组件 https://github.com/angular/angular- ...

  7. REQUIRES_NEW 如果不在一个事务那么自己创建一个事务 如果在一个事务中 自己在这个大事务里面在创建一个子事务 相当于嵌套事务 双层循环那种

    REQUIRES_NEW   如果不在一个事务那么自己创建一个事务 如果在一个事务中 自己在这个大事务里面在创建一个子事务  相当于嵌套事务 双层循环那种 不管是否存在事务,业务方法总会自己开启一个事 ...

  8. 第三百七十四节,Django+Xadmin打造上线标准的在线教育平台—创建课程app,在models.py文件生成4张表,课程表、课程章节表、课程视频表、课程资源表

    第三百七十四节,Django+Xadmin打造上线标准的在线教育平台—创建课程app,在models.py文件生成4张表,课程表.课程章节表.课程视频表.课程资源表 创建名称为app_courses的 ...

  9. 第三百七十三节,Django+Xadmin打造上线标准的在线教育平台—创建用户app,在models.py文件生成3张表,用户表、验证码表、轮播图表

    第三百七十三节,Django+Xadmin打造上线标准的在线教育平台—创建用户app,在models.py文件生成3张表,用户表.验证码表.轮播图表 创建Django项目 项目 settings.py ...

随机推荐

  1. Java连接Redis,存储对象获取对象()byte和json),连接池

    Java连接Redis Jedis连接Redis,Lettuce连接Redis Jedis连接Redis 1. 创建maven项目 2. 引入依赖 <dependencies> <d ...

  2. SSH config语法关键字

    1.SSH config 语法关键字 host 别名 HostName 主机名(ip) User    用户(root就是一个用户) Port 端口(默认22) IdentityFile 密钥文件的路 ...

  3. Linux探测工具BCC(可观测性)

    BCC(可观测性) 目录 BCC(可观测性) 简介 动机 版本要求 安装 安装依赖 安装和编译LLVM 安装和编译BCC windows源码查看 BCC的基本使用 工具讲解 execsnoop ope ...

  4. C++中简单程序出现Segmentation fault (core dumped)段错误

    段错误就是指访问的内存超出了系统所给这个程序的内存空间.一般是随意使用野指针或者数组.数组越界. ------两种简单解决方法:1.利用GDB调试,定位出错位置.(具体可查找博客详细学习)2.在可能出 ...

  5. C#LeetCode刷题之#724-寻找数组的中心索引( Find Pivot Index)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3742 访问. 给定一个整数类型的数组 nums,请编写一个能够返 ...

  6. centos环境 使用kubeadm快速安装k8s集群v1.16.2

    全程使用root用户运行,宿主机需要连接外网 浏览一下官方kubeadm[有些镜像用不了] https://kubernetes.io/docs/setup/production-environmen ...

  7. Xor 思维题

    Xor 思维题 题目描述 小\(Q\)与小\(T\)正在玩一棵树.这棵树有\(n\)个节点,编号为 \(1\),\(2\) \(3...n\),由\(n-1\)条边连接,每个节点有一个权值\(w_i\ ...

  8. Debug很重要

    之前做一个小功能,就是用php发送邮件,项目中已经使用了wordpress的wp_mail,所以同事建议我继续用wp_mail函数. 然而遇到了一个奇怪的情况,邮件没有发出去,也没有任何报错日志. 照 ...

  9. (转载)sqlserver2008”备份集中的数据库备份与现有的XX数据库不同”解决办法

    原文链接:https://www.cnblogs.com/huangfr/archive/2012/08/09/2629687.html 因为是在另一台电脑对同名数据库做的备份,用常规方法还原,提示不 ...

  10. 笔记:Ubuntu安装LAMP环境

    一.更换Ubuntu的镜像源 镜像源路径:/etc/apt/sources.list 备份:cp /etc/apt/sources.list /etc/apt/souces.list.bak 使用阿里 ...