在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` ...
随机推荐
- 2020-04-05:谈一下spring事务传播
- C#LeetCode刷题之#167-两数之和 II - 输入有序数组(Two Sum II - Input array is sorted)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3903 访问. 给定一个已按照升序排列 的有序数组,找到两个数使得 ...
- Flutter 容器 (1) - Center
Center容器用来居中widget import 'package:flutter/material.dart'; class AuthList extends StatelessWidget { ...
- 苹果TF上架的iOS应用怎么下载
苹果TF上架的iOS应用怎么下载 苹果TF上架的iOS应用是无法通过App Store搜索到的,需要用户先从App Store中搜索下载testflight内测商店.当开发者进行苹果TF上架成功以后会 ...
- Vue中 props 这些知识点
如果你一直在阅读有关"props"内容,你会发现我们可能也一直在使用它们(即使没有意识到),但也许你并不完全确定它们是什么.或者如何正确使用它们,并充分利用它们. 当你读完这篇指南 ...
- 什么是c/c++编译
GCC是什么 GNU Compiler Collection的缩写,一开始是c语言的编译器,但现今可以支持多种语言的编译工作,也支持了多个硬件平台的编译.总而言之,主流的c语言编译器就是这个gcc了. ...
- JDBC | 第一章: 快速开始使用JDBC连接Mysql数据库?
开始使用基于java的JDBC技术来连接mysql进行msyql数据库简单的CRUD操作 下载对应mysql驱动包 这里我创建maven项目基于maven下载 <!--mysql 驱动--> ...
- magento 2 cronjob setup
crontab -u magento_user -e */5 * * * * php /var/www/html/bin/magento cron:run >> /var/www/html ...
- hdu.2042 超级楼梯
这种递归来写,除了递归我也想不到怎么写了 AC代码: #include<iostream>using namespace std;int x[41];//打表,不打表我不用想就知道过不了, ...
- Vue的Options
el:挂载点 与$mount有替换关系 new Vue({ el: "#app" }); new Vue({}).$mount('#app') 注:被你选为挂载点的那个元素,如果在 ...