• 📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!
  • 📢本文作者:由webmote 原创,首发于 【掘金】
  • 📢作者格言: 生活在于折腾,当你不折腾生活时,生活就开始折腾你,让我们一起加油!💪💪💪
  • 干大事,需要学会分解目标。

    插入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;
    

    只要我们调节参数 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月更新完毕,其实还是蛮困难的,写到最后都不知道写啥了,生成速度完全跟不上啊。

    例行小结,理性看待!

    结的是啥啊,结的是我想你点赞而不可得的寂寞。😳😳😳

    👓都看到这了,还在乎点个赞吗?

    👓都点赞了,还在乎一个收藏吗?

    👓都收藏了,还在乎一个评论吗?

  • 私信
     1,859