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

2020年3月15日08点58分实验开始

创建仅有四千数据的tb_4thousand1表:

  1. SQL> CREATE TABLE tb_4thousand1
  2. 2 (
  3. 3 id NUMBER not null primary key,
  4. 4 name NVARCHAR2(60) not null,
  5. 5 salary int NOT NULL,
  6. 6 createtime TIMESTAMP (6) not null
  7. 7 );
  8.  
  9. 表已创建。
  10.  
  11. 已用时间: 00: 00: 00.12

给这张表充值:

  1. SQL> insert into tb_4thousand1
  2. 2 select rownum,
  3. 3 dbms_random.string('*',dbms_random.value(6,20)),
  4. 4 dbms_random.value(1000,50000),
  5. 5 sysdate
  6. 6 from dual
  7. 7 connect by level<=4000
  8. 8 order by dbms_random.random;
  9.  
  10. 已创建4000行。
  11.  
  12. 已用时间: 00: 00: 00.48

再创建一张同构的表tb_4thousand2

  1. SQL> CREATE TABLE tb_4thousand2
  2. 2 (
  3. 3 id NUMBER not null primary key,
  4. 4 name NVARCHAR2(60) not null,
  5. 5 salary int NOT NULL,
  6. 6 createtime TIMESTAMP (6) not null
  7. 7 )
  8. 8 ;
  9.  
  10. 表已创建。
  11.  
  12. 已用时间: 00: 00: 00.01

给这张表充值:

  1. SQL> insert into tb_4thousand2
  2. 2 select rownum,
  3. 3 dbms_random.string('*',dbms_random.value(6,20)),
  4. 4 dbms_random.value(1000,50000),
  5. 5 sysdate
  6. 6 from dual
  7. 7 connect by level<=4000
  8. 8 order by dbms_random.random;
  9.  
  10. 已创建4000行。
  11.  
  12. 已用时间: 00: 00: 00.18

然后看看tb_4thousand1和tb_4thousand2表的笛卡儿积有多少数据:

  1. SQL> select count(*) from (select t1.* from tb_4thousand1 t1 cross join tb_4thousand2 t2);
  2.  
  3. COUNT(*)
  4. ----------
  5. 16000000
  6.  
  7. 已用时间: 00: 00: 00.56

一千六百万,这就是我们想要的,下面开始建表:

  1. SQL> create table tb_16million2 as select t1.* from tb_4thousand1 t1 cross join tb_4thousand2 t2;
  2.  
  3. 表已创建。
  4.  
  5. 已用时间: 00: 00: 21.52

至此,实验时间为2020年3月15日09点00分,也就是说我们用两分钟就创建了一张一千六百万大表!

当然,这张表的id字段需要规整一下:

  1. SQL> update tb_16million2 set id=rownum where 1=1;
  2.  
  3. 已更新16000000行。
  4.  
  5. 已用时间: 00: 13: 06.69

短短的更新语句,跑出了13分钟,真是个漫长的等待!看来需要一条条设置数据的sql就是耗时的。

最后给tb_16million2表设上主键:

  1. SQL> ALTER TABLE tb_16million2 ADD CONSTRAINT tb_16million2_pk PRIMARY KEY (id);
  2.  
  3. 表已更改。
  4.  
  5. 已用时间: 00: 00: 40.60

至此实验结束,时间为2020年3月15日09点17分,其中13分钟是放在update语句上了。

好了,我们又多了一种创建大表的选择,那就是利用笛卡儿积,两分钟建成一千六百万大表的速度确实可以让人兴奋一把。

下面是上文提到的所有sql:

  1. 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. )
  8.  
  9. insert into tb_4thousand1
  10. select rownum,
  11. dbms_random.string('*',dbms_random.value(6,20)),
  12. dbms_random.value(1000,50000),
  13. sysdate
  14. from dual
  15. connect by level<=4000
  16. order by dbms_random.random
  17.  
  18. CREATE TABLE tb_4thousand2
  19. (
  20. id NUMBER not null primary key,
  21. name NVARCHAR2(60) not null,
  22. salary int NOT NULL,
  23. createtime TIMESTAMP (6) not null
  24. )
  25.  
  26. insert into tb_4thousand2
  27. select rownum,
  28. dbms_random.string('*',dbms_random.value(6,20)),
  29. dbms_random.value(1000,50000),
  30. sysdate
  31. from dual
  32. connect by level<=4000
  33. order by dbms_random.random
  34.  
  35. select count(*) from (select t1.* from tb_4thousand1 t1 cross join tb_4thousand2 t2)
  36.  
  37. create table tb_16million2 as select t1.* from tb_4thousand1 t1 cross join tb_4thousand2 t2
  38.  
  39. update tb_16million2 set id=rownum where 1=1;
  40.  
  41. 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. canvas小画板——(2)荧光笔效果

    我们在上一篇文章中讲了如何绘制平滑曲线 canvas小画板——(1)平滑曲线. 透明度实现荧光笔 现在我们需要加另外一种画笔效果,带透明度的荧光笔.那可能会觉得绘制画笔的时候加上透明度就可以了.我们来 ...

  2. Java容器类Collection,List,Set,Map.,Iterator,Collections工具类,Arrays工具类,Comparable

    Java容器类Collection,List,Set,Map.,Iterator,Collections工具类,Arrays工具类,Comparable接口,泛型 Collection,List,Se ...

  3. 我搭的神经网络不work该怎么办!看看这11条新手最容易犯的错误

    1. 忘了数据规范化 2. 没有检查结果 3. 忘了数据预处理 4. 忘了正则化 5. 设置了过大的批次大小 6. 使用了不适当的学习率 7. 在最后一层使用了错误的激活函数 8. 网络含有不良梯度 ...

  4. java JDBC工具类

    package com.oracle.tools; import java.sql.Connection; import java.sql.DriverManager; import java.sql ...

  5. C#算法设计查找篇之04-斐波那契查找

    斐波那契查找(Fibonacci Search) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/704 访问. 斐波那契 ...

  6. 防止多次引入js文件导致的重复注册点击事件

    前端代码中的js文件如果是动态引入的或者是某个事件操作进行注册的,那么重复的引入js文件或者多次触发注册事件会导致事件多次进行注册,造成不必要的麻烦,所以需要在每次注册之前将先前的事件进行取消,下面以 ...

  7. 【ASP.NET Core学习】使用JWT认证授权

    概述 认证授权是很多系统的基本功能 , 在以前PC的时代 , 通常是基于cookies-session这样的方式实现认证授权 , 在那个时候通常系统的用户量都不会很大, 所以这种方式也一直很好运行, ...

  8. vue自定义可输入的选择框组件

    vue自定义可输入的选择框组件 props: 属性 说明 类型 默认值 selectDataList 下拉框中的内容 Array 空数组([]) value 输入框中的内容 String 空字符串(& ...

  9. goalng包和命令工具

    1. 包简介 任何包系统设计的目的都是为了简化大型程序的设计和维护工作,通过将一组相关的特性放进一个独立的单元以便于理解和更新,在每个单元更新的同时保持和程序中其它单元的相对独立性.这种模块化的特性允 ...

  10. 利用JavaScript当鼠标点击导航时改变背景

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...