在Oracle中十分钟内创建一张千万级别的表
小表不会产生性能问题,大表才会。要练习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中十分钟内创建一张千万级别的表的更多相关文章
- 在Oracle中快速创建一张百万级别的表,一张十万级别的表 并修改两表中1%的数据 全部运行时间66秒
万以下小表做性能优化没有多大意义,因此我需要创建大表: 创建大表有三种方法,一种是insert into table selec..connect by.的方式,它最快但是数据要么是连续值,要么是随机 ...
- Oracle中创建千万级大表归纳
从一月至今,我总共归纳了三种创建千万级大表的方案,它们是: 下面是这三种方案的对比表格: # 名称 地址 主要机制 速度 1 在Oracle中十分钟内创建一张千万级别的表 https://www.cn ...
- 如何在十分钟内插入1亿条记录到Oracle数据库?
这里提供一种方法,使用 APPEND 提示,使得十分钟内插入上亿数据成为可能. -- Create table create table TMP_TEST_CHAS_LEE ( f01 VARCHAR ...
- 基于 Laravel-Admin 在十分钟内搭建起功能齐全的后台模板
http://laravelacademy.org/post/6468.html 1.简介 为 Laravel 提供后台模板的项目越来越多,学院君已陆续为大家介绍过Laravel Angular Ad ...
- django 实现同一个ip十分钟内只能注册一次
很多小伙伴都会有这样的问题,说一个ip地址十分钟内之内注册一次,用来防止用户来重复注册带来不必要的麻烦 逻辑: 取ip,在数据库找ip是否存在,存在判断当前时间和ip上次访问时间之差,小于600不能注 ...
- django 实现同一个ip十分钟内只能注册一次(redis版本)
上一篇文章,django 实现同一个ip十分钟内只能注册一次 的时候,我们在注册的时候选择使用的使我们的数据库来报错我们的注册的ip信息,可是如果数据量大,用户多的时候,单单靠我们的数据库 来储存我们 ...
- 在mysql数据库中制作千万级测试表
在mysql数据库中制作千万级测试表 前言: 最近准备深入的学一下mysql,包括各种引擎的特性.性能优化.分表分库等.为了方便测试性能.分表等工作,就需要先建立一张比较大的数据表.我这里准备先建一张 ...
- Mysql学习总结(22)——Mysql数据库中制作千万级测试表
前言: 为了方便测试性能.分表等工作,就需要先建立一张比较大的数据表.我这里准备先建一张千万记录用户表. 步骤: 1 创建数据表(MYISAM方式存储插入速度比innodb方式快很多) 数据表描述 数 ...
- spring boot 实现密码连续输入错误5次,限制十分钟内不能进行登录
我们要实现的就是,密码连续输入错误5次,就限制用户十分钟不能进行登录. 大致的流程图 数据库设计如下 DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ...
随机推荐
- shazidouhui的使用体验
这个软件有三个界面,一个是我的,一个是已批改作业,一个是未完成作业,但是,我不知道怎么用除了“我的”这个界面以外的其他两个界面,这一点还是需要优化优化,另外就是登陆界面确实还存在一点问题,有待改进.
- python关于函数调用作为参数的说明&&装饰器
python关于函数调用作为参数的说明&&装饰器 简单的: 先看代码: def out(): print('out') def inner(): return 'inner' retu ...
- Mybatis-06-Lombok
偷懒神器Lombok 1. 什么是Lombok? java library plugs build tools 2.使用步骤: 在IDEA中安装Lombok插件 在项目中导入lombok的jar包 ...
- 学长小清新题表之UOJ 180.实验室外的攻防战
学长小清新题表之UOJ 180.实验室外的攻防战 题目描述 时针指向午夜十二点,约定的日子--\(2\)月\(28\)日终于到来了.随着一声枪响,伏特跳蚤国王率领着他的跳蚤大军们包围了 \(picks ...
- Android 重写物理返回键,在h5页面中返回上一个界面
实现:Activity中放置webview,跳转到h5界面,点击返回键,不退出h5界面,而是返回上一个h5界面 /** * 改写物理按键--返回的逻辑,希望浏览的网页后退而不是退出浏览器 * @par ...
- C++判断是回文串还是镜像串
#include <iostream> #include <string> #include <cstdio> #include <cctype> #p ...
- 笔记:Linux用户管理(补充)、权限管理、内存管理、网络管理、渗透常用命令
一.用户管理(补充) 添加用户:useradd [选项] 用户名 useradd -u 5000 -g demogroup -G root -d /home/demo -s /bin/bash dem ...
- Docker商业版受限,胖容器是个选择
前情概要 8月13日,Docker 公司更新了网站服务协议,条款申明,禁止禁运国家和被列入「美国实体清单」的组织和个人使用带有该服务协议链接的 Docker 网站和所有相关网站.这一更新协议迅速引起了 ...
- Spring注解驱动开发02(作用域和懒加载)
Spring中bean的作用域 默认情况下,Spring只为每个在IOC容器里声明的bean创建唯一一个实例,整个IOC容器范围内都能共享该实例:所有后续的getBean()调用和bean引用都将返回 ...
- Galera Cluster for MySQL 集群恢复
node1: 1.rm -rf grastate.dat 2.mysqld_safe --wsrep-recover 3.galera_new_cluster node2: systemctl res ...