- 如有错误敬请指正,赐人玫瑰,手留余香!
- 📢作者格言: 生活在于折腾,当你不折腾生活时,生活就开始折腾你,让我们一起加油!💪💪💪
序言
干大事,需要学会分解目标。
插入1个亿,可以分解为插入10个1000w数据,进而分成插入100个100w数据…
那么让我们从小研究,怎么插入100条数据?
1. 批量插入几百条数据
对大部分数据库来说,批量插入数据都是比较简单的事情,最简单的方法无非是写好一条insert into语句,通过简单的复制和拷贝,就可以瞬间搞定100条插入数据。
然后借助sql的带界面的管理工具,比如Navicat系列,我们可以迅速执行这些语句,多次执行就可以产生成百上千条数据量了。
那么怎么搞定几百万数据呢? 一直靠点击执行,是不是太累了?
2.批量插入几百万条数据
数据库几乎都有存储过程功能,在存储过程内均支持一定的语法,来支持for循环,我们只需要利用这个功能,把我们的数据写到存储过程中,那么几百万甚至上千万的数据也不是问题。
CREATE OR REPLACE PROCEDURE "public"."InsertChar10001"()
AS $BODY$BEGIN
declare
campaignId varchar(32):='';
autoInvitationId varchar(32):='';
siteId int:=0;
sentNum int:=0;
acceptNum int:=0;
refuseNum int:=0;
logTime timestamptz:='2010-01-01 00:00:00.000';
rand int:=0;
ncount int:=0;
ifQueued int:=ceil(random()*(2-1)+1);
status int:=ceil(random()*(5-1)+1);
nsource int:=0;
preChatSocialMediaSource int:=0;
preChatTicketId int:=0;
visitorMessagesCount int:=0;
ii int;
ss timestamptz:=logtime;
randTime varchar(50) := to_char(logTime, 'YYYY-MM-DD HH24:MI:SS');
begin
ii:=1;
for ii in 1..1000000 loop
INSERT INTO "T_TEST"
("Id","SessionId"
,"StartTime"
,"EndTime"
)
select
uuid_generate_v4() Id,
uuid_generate_v4() SessionId
,logTime StartTime
,logtime + interval '100 second' EndTime
;
end loop;
end;
END$BODY$
LANGUAGE plpgsql
只要我们调节参数 for ii in 1..1000000
,那么我们就可以自由定制数据量的大小,精确的生成随机数据到表内。
问题又来了,这么执行,生成几百万的数据,速度换可以接受,但是1000w以后,很多数据库都出现了问题,速度非常慢,有的甚至需要好几个小时才能生成数据。
那么怎么办呢?
3. 万能方法
牢记秘诀: insert into ... select ...
。 几乎所有数据库都支持,并且速度都很快!
使用这个方法可以翻倍表内的数据,比如100w到200w,200w到400w… ,唯一的弊端就是有大量重复的数据。
INSERT INTO "T_TEST"
("Id",
"SessionId"
,"StartTime"
,"EndTime")
select uuid_generate_v4() "Id",
"SessionId"
,"StartTime"
,"EndTime" from "T_TEST"
如果想精确复制的条数,可以利用 类似 select top n
方式指定数据量,或者 where条件等等,自己自由组合吧。
需要注意的是,你的数据库容量需要足够哦,看我就出错了。
4. 小结
8月更新完毕,其实还是蛮困难的,写到最后都不知道写啥了,生成速度完全跟不上啊。
例行小结,理性看待!
结的是啥啊,结的是我想你点赞而不可得的寂寞。😳😳😳