小表不会产生性能问题,大表才会。要练习SQL调优,还非得有大表不可。但数据不会自然产生,没有数据时如何创建一张千万级别的大表呢?

之前,我想用Oracle的批量插入语法去插入数据,此语法如下:

INSERT ALL
INTO firsttb(NAME, age,createdtime) values('E1','',sysdate)
INTO firsttb(NAME, age,createdtime) values('E2','',sysdate)
INTO firsttb(NAME, age,createdtime) values('E3','',sysdate)
...
INTO firsttb(NAME, age,createdtime) values('E250','',sysdate)
select * from dual

通过Java程序,可以把Insert all 和 select * from dual 之间插入大批数据,然后一次性送给数据库去执行。

但是,这种方法是有限制的,在我的T440p机器上,Insert all 和 select * from dual 之间大约就能插250行左右,那么提交一千条数据需要四次IO。

而百万级插入需要十分钟,千万级就到了一个小时...太耽误事了,因此我只得寻求其它方案。

后来,我想出了以下步骤供大家参考:

先创建一张基础表,这张表结构应与你最终想建的表一致:

CREATE TABLE HY_million
(
id NUMBER not null primary key,
name NVARCHAR2(60) not null,
score NUMBER(4,0) NOT NULL,
createtime TIMESTAMP (6) not null
)

然后往这张表里插入两百万数据:

 Insert into HY_million
select rownum,dbms_random.string('*',dbms_random.value(6,20)),dbms_random.value(0,20),sysdate from dual
connect by level<=2000000
order by dbms_random.random

注意200,0000这个值是根据机器来的,性能好的可以调大,说不定可以直接创建出千万数据,那么下面的步骤就省了,如果你不幸和我一样机器性能受限,那么还得继续下面的步骤。

先commit一次,接下来连表结构带数据创建目标表:

 create table hy_million2 as select * from HY_million

查一下hy_million2有多少数据:

 select count(*) from hy_million2

发现是两百万,目前这个表结构和HY_million是一样的,但没有约束,这正适合往里插入数据。

将以下语句执行四遍。

 insert into hy_million2 select * from HY_million

执行完成hy_million2就有一千万数据了。

再执行下面语句把id规整一下:

update hy_million2 set id=rownum where 1=1

再看看规整得怎么样:

 select count(distinct id) from hy_million2

不出意外的话,结果应该是一千万。

然后再次commit。

最后给表设上主键:

 ALTER TABLE hy_million2 ADD CONSTRAINT constraint_million2 PRIMARY KEY (id);

之后,就可以开始使用这张千万级别的表了。

我的执行记录:

Table HY_MILLION created.

2,000,000 rows inserted.

Commit complete.

Table HY_MILLION2 created.

Commit complete.

2,000,000 rows inserted.

2,000,000 rows inserted.

2,000,000 rows inserted.

2,000,000 rows inserted.

10,000,000 rows updated.

Commit complete.

Table HY_MILLION2 altered.

我总的执行时间十分钟不到,你应该能做得更好。

参考资料:

https://blog.csdn.net/paullinjie/article/details/80615295

附:MySQL批量插入语法

Mysql batch-insert grammar:
insert into emp(name,age,cdate)
values
('A' , 20, '2019-10-13 00:00:00'),
('B' , 21, '2019-10-13 01:00:00'),
('C' , 22, '2019-10-13 05:00:00')

MySql批量插入远比Oracle快,采用这种语法仅用程序就可以达到高速,具体实验请看:

https://www.cnblogs.com/xiandedanteng/p/11666743.html

--END-- 2020-01-09 09:51

在Oracle中十分钟内创建一张千万级别的表的更多相关文章

  1. 在Oracle中快速创建一张百万级别的表,一张十万级别的表 并修改两表中1%的数据 全部运行时间66秒

    万以下小表做性能优化没有多大意义,因此我需要创建大表: 创建大表有三种方法,一种是insert into table selec..connect by.的方式,它最快但是数据要么是连续值,要么是随机 ...

  2. Oracle中创建千万级大表归纳

    从一月至今,我总共归纳了三种创建千万级大表的方案,它们是: 下面是这三种方案的对比表格: # 名称 地址 主要机制 速度 1 在Oracle中十分钟内创建一张千万级别的表 https://www.cn ...

  3. 如何在十分钟内插入1亿条记录到Oracle数据库?

    这里提供一种方法,使用 APPEND 提示,使得十分钟内插入上亿数据成为可能. -- Create table create table TMP_TEST_CHAS_LEE ( f01 VARCHAR ...

  4. 基于 Laravel-Admin 在十分钟内搭建起功能齐全的后台模板

    http://laravelacademy.org/post/6468.html 1.简介 为 Laravel 提供后台模板的项目越来越多,学院君已陆续为大家介绍过Laravel Angular Ad ...

  5. django 实现同一个ip十分钟内只能注册一次

    很多小伙伴都会有这样的问题,说一个ip地址十分钟内之内注册一次,用来防止用户来重复注册带来不必要的麻烦 逻辑: 取ip,在数据库找ip是否存在,存在判断当前时间和ip上次访问时间之差,小于600不能注 ...

  6. django 实现同一个ip十分钟内只能注册一次(redis版本)

    上一篇文章,django 实现同一个ip十分钟内只能注册一次 的时候,我们在注册的时候选择使用的使我们的数据库来报错我们的注册的ip信息,可是如果数据量大,用户多的时候,单单靠我们的数据库 来储存我们 ...

  7. 在mysql数据库中制作千万级测试表

    在mysql数据库中制作千万级测试表 前言: 最近准备深入的学一下mysql,包括各种引擎的特性.性能优化.分表分库等.为了方便测试性能.分表等工作,就需要先建立一张比较大的数据表.我这里准备先建一张 ...

  8. Mysql学习总结(22)——Mysql数据库中制作千万级测试表

    前言: 为了方便测试性能.分表等工作,就需要先建立一张比较大的数据表.我这里准备先建一张千万记录用户表. 步骤: 1 创建数据表(MYISAM方式存储插入速度比innodb方式快很多) 数据表描述 数 ...

  9. spring boot 实现密码连续输入错误5次,限制十分钟内不能进行登录

    我们要实现的就是,密码连续输入错误5次,就限制用户十分钟不能进行登录. 大致的流程图 数据库设计如下 DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ...

随机推荐

  1. JVM系列之:再谈java中的safepoint

    目录 safepoint是什么 safepoint的例子 线程什么时候会进入safepoint safepoint是怎么工作的 总结 safepoint是什么 java程序里面有很多很多的java线程 ...

  2. 【Spring注解驱动开发】使用@PropertySource加载配置文件,我只看这一篇!!

    写在前面 很多小伙伴都在问:冰河,你的Spring专题更新完了吗?怎么感觉像是写了一半啊?我:没有更新完呀,整个专题预计会有70多篇.那怎么更新了一半就去写别的了呢?那是因为有很多其他的小伙伴在后台留 ...

  3. JS学习第一天

    JS的三种引入方式: 内联:在标签属性中引入javascript:js代码    <a href="javascript:("helloworld")"& ...

  4. 解决pgAdmin4启动失败方法

    1. 问题现象 有时pgadmin 4启动仅显示启动界面, 或者 点击图标一直都没反应,启动界面用鼠标点击下就消失了, 然后过很长时间就保错: the application server could ...

  5. QUIC协议详解之Initial包的处理

    从服务器发起请求开始追踪,细说数据包在 QUIC 协议中经历的每一步.大量实例代码展示,简明易懂了解 QUIC. 前言 本文介绍了在 QUIC 服务器在收到 QUIC 客户端发起的第一个 UDP 请求 ...

  6. 【特别篇】不为人知的U盘秘密

    U盘是我们代码爱好者的必要东西,方便于我们更好的拷文件,使用一些已经配置好的东西,比如说:小编经常会将linux系统放进去,平时就可以随时用了. But 你的U盘真的正常吗?你了解多少? 关于U盘   ...

  7. Vue3.0数据响应式原理

    在vue2版本中响应式使用的是ES5对象的操作,通过遍历对象Object.defineProperty属性值的变化,实现监听数据 在3.0中使用的ES6版本的Proxy代理对象方式来实现数据的监听,省 ...

  8. umount 时目标忙解决办法

    [root@node2 ~]# umount /var/lib/ceph/osd/ceph- umount: /var/lib/ceph/osd/ceph-:目标忙. (有些情况下通过 lsof() ...

  9. 个人项目wc(C语言)

    github地址:https://github.com/nilonger/mycangku 一.项目要求 1.wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写一个 ...

  10. 码云git clone报错Incorrect username or password ( access token )

    使用码云将仓库clone到本地,报错信息如下: D:\>git clone https://gitee.com/ycyzharry/helloworld.git Cloning into 'he ...