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

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. Quartz.Net的基础使用方法,多任务执行继续扩展

    前一篇随笔讲了Quartz多任务的简单实现 Quartz.Net的基础使用方法,多任务执行 这一篇,来简单对前一篇进行一下简单的扩展 看了前一篇的代码会发现,每次新增一个任务还要去GetJobs方法里 ...

  2. speedtest测速网站测速节点添加流程

    一.准备一台服务器: 系统需求:常见Linux系统: 二.服务器入网(确保可以访问互联网): 三.ssh登录到服务器安装speedtest守护程序程序包: 安装和启动,执行以下命令: curl -O ...

  3. golang bool值

    目录 前言 1.基本介绍 2.类型转换 3.使用: 跳转 前言 不做文字的搬运工,多做灵感性记录 这是平时学习总结的地方,用做知识库 平时看到其他文章的相关知识,也会增加到这里 随着学习深入,会进行知 ...

  4. 前端实现图片上传预览并转换base64

    前端实现文件的上传,就必须用到input标签,type属性为file. 在vue项目中通ref操作dom.input有一个属性accept,是必须要搭配type=file使用. multiple可以上 ...

  5. docker-machine在阿里云部署批量部署docker

    概述 docker入门中,docker swarm都是在本机的虚拟机上,为了更贴近生产环境,我将这部分重新部署到阿里云.不需要太贵,选最便宜的按量付费ECS,1小时才0.05元. docker-mac ...

  6. 12. oracle 常用函数

    一.字符函数字符函数是oracle中最常用的函数,我们来看看有哪些字符函数:lower(char):将字符串转化为小写的格式.upper(char):将字符串转化为大写的格式.length(char) ...

  7. linux下top命令详细介绍

    linux下top命令详细介绍 top 命令是 Linux 下常用的系统资源占用查看及性能分析工具,能够实时显示系统中各个进程的资源(比如cpu.内存的使用)占用状况,top命令的执行结果是一个动态显 ...

  8. HM16.0之帧间Merge模式——xCheckRDCostMerge2Nx2N

    参考:https://blog.csdn.net/nb_vol_1/article/details/51163625 1.源代码: /** check RD costs for a CU block ...

  9. Logistic回归分析之二元Logistic回归

    在研究X对于Y的影响时,如果Y为定量数据,那么使用多元线性回归分析(SPSSAU通用方法里面的线性回归):如果Y为定类数据,那么使用Logistic回归分析. 结合实际情况,可以将Logistic回归 ...

  10. 方差分析、T检验、卡方分析如何区分?

    差异研究的目的在于比较两组数据或多组数据之间的差异,通常包括以下几类分析方法,分别是方差分析.T检验和卡方检验. 三个方法的区别 其实核心的区别在于:数据类型不一样.如果是定类和定类,此时应该使用卡方 ...