使用Postgresql 實現(xiàn)快速插入測試數(shù)據(jù)
1.創(chuàng)建常規(guī)的企業(yè)信息表
create table t_centerprises( objectid bigint not null, /*唯一編號(6位行政區(qū)號+6位sn)*/ divid uuid not null, /*行政區(qū)唯一代碼*/ name text not null, /*企業(yè)名稱*/ address text not null, /*企業(yè)地址*/ post text, /*企業(yè)郵編*/ contacts text, /*聯(lián)系人*/ tel text, /*聯(lián)系電話*/ fax text, /*傳真*/ describe text, /*企業(yè)備注*/ date timestamp default now() not null, /*創(chuàng)建日期*/ constraint pk_centerprisess_objectid primary key (objectid), constraint fk_centerprises_divid foreign key(divid) references ts_divisions(objectid) on delete cascade ); create index idx_centerprises_divid on t_centerprises(divid);
2.需要使用的函數(shù)
/*轉(zhuǎn)換16進制到字符*/ drop function if exists hex_to_string(text); create or replace function hex_to_string( text) returns text as $$ declare result text; begin execute 'select U&''\' || $1 || '''' INTO result; return result; end; $$ language plpgsql; /*隨機生成漢字 漢字范圍U+4E00..U+9FA5 */ drop function if exists gen_random_zh(int,int); create or replace function gen_random_zh(imin int,imax int) returns text as $$ declare vlen integer; result text; begin result := ''; vlen = floor(random()*(imax-imin)+imin); for i in 1..vlen loop result := result || hex_to_string(to_hex(floor(random()*(42191-19968)+19968)::integer)); end loop; return result; end; $$ language plpgsql;
3.常規(guī)測試數(shù)據(jù)插入(5000000條)
insert into t_centerprises(objectid,divid,name,address,post,contacts,tel,fax,describe) select (vdivid|| lpad(id::text,6,'0'))::bigint as objectid,'110101', gen_random_zh(5,25) as name,gen_random_zh(10,50) as address, floor(random()*(699999-600000)+600000) as post,gen_random_zh(2,8) as contacts, floor(random()*(69999999-60000000)+60000000) as tel,floor(random()*(69999999-60000000)+60000000) as fax, gen_random_zh(32,128) as describe from generate_series(1,5000000) as id;
在普通pc機上插入,大概完成時間約8小時,過程不可監(jiān)控,并且cpu/內(nèi)存占用率高,磁盤基本滿負荷動作,讀寫率基本上都是100%.
4.改進后的方法, 插入(10000000條)
do $$ declare vStart bigint; declare vEnd bigint; declare MAXVALE bigint; declare INTERVAL bigint; declare vprovince integer; declare vprefecture integer; declare vcounty integer; declare vdivid text; declare vdividex uuid; begin vprovince := 10;vprefecture := 1;vcounty := 1; MAXVALE := 1000000; INTERVAL := 1000; vStart := 1 ;vEnd := INTERVAL; vdivid := (lpad(vprovince::text,2,'0') || lpad(vprefecture::text,2,'0') || lpad(vcounty::text,2,'0'))::text; vdividex := (select objectid from ts_divisions where province=vprovince and prefecture=vprefecture and county=vcounty); loop insert into t_centerprises(objectid,divid,name,address,post,contacts,tel,fax,describe) select (vdivid|| lpad(id::text,6,'0'))::bigint as objectid,vdividex as divid, gen_random_zh(5,25) as name,gen_random_zh(10,50) as address, floor(random()*(699999-600000)+600000) as post,gen_random_zh(2,8) as contacts, floor(random()*(69999999-60000000)+60000000) as tel,floor(random()*(69999999-60000000)+60000000) as fax, gen_random_zh(32,128) as describe from generate_series(vStart,vEnd) as id; raise notice '%', vEnd; vStart := vEnd + 1; vEnd := vEnd + INTERVAL; if( vEnd > MAXVALE ) then return; elsif(vEnd = MAXVALE) then vEnd := vEnd - 1; end if; end loop; end$$;
因為運算原因, cpu/內(nèi)存占用率仍然很高, 硬盤負荷較小,讀寫率也比較低,大概完成時間約1.5小時.
補充:postgreSQL數(shù)據(jù)庫 向表中快速插入1000000條數(shù)據(jù)
不用創(chuàng)建函數(shù),直接向表中快速插入1000000條數(shù)據(jù)
create table tbl_test (id int, info text, c_time timestamp); insert into tbl_test select generate_series(1,100000),md5(random()::text),clock_timestamp(); select count(id) from tbl_test; --查看個數(shù)據(jù)條數(shù)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
PostgreSql觸發(fā)器創(chuàng)建、使用以及刪除示例詳解
在PostgreSQL中觸發(fā)器函數(shù)是一個沒有參數(shù)并且返回trigger類型的函數(shù),這篇文章主要給大家介紹了關(guān)于PostgreSql觸發(fā)器創(chuàng)建、使用以及刪除的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-03-03
PostgreSQL中offset...limit分頁優(yōu)化的一些常見手段
我們在使用數(shù)據(jù)庫進行分頁查詢時,隨著offset過濾的數(shù)據(jù)越來越多,查詢也會越來越慢,下面這篇文章主要給大家介紹了關(guān)于PostgreSQL中offset...limit分頁優(yōu)化的一些常見手段,需要的朋友可以參考下2023-05-05
postgres array_to_string和array的用法講解
這篇文章主要介紹了postgres array_to_string和array的用法講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01
postgresql數(shù)據(jù)庫執(zhí)行計劃圖文詳解
了解PostgreSQL執(zhí)行計劃對于程序員來說是一項關(guān)鍵技能,執(zhí)行計劃是我們優(yōu)化查詢,驗證我們的優(yōu)化查詢是否確實按照我們期望的方式運行的重要方式,這篇文章主要給大家介紹了關(guān)于postgresql數(shù)據(jù)庫執(zhí)行計劃的相關(guān)資料,需要的朋友可以參考下2024-01-01
postgresql數(shù)據(jù)庫表ID自增的實現(xiàn)代碼
postgresql數(shù)據(jù)庫可以創(chuàng)建主鍵,但是沒有像mysql那樣直接指定主鍵自增的auto_increment關(guān)鍵字,因此如果在postgresql中創(chuàng)建表指定主鍵自增使用auto_increment會報錯,本文通過一個實例給大家演示自增ID的實現(xiàn),需要的朋友可以參考下2023-12-12

