postgres 使用存儲(chǔ)過(guò)程批量插入數(shù)據(jù)的操作
參考官方文檔
create or replace function creatData2() returns boolean AS $BODY$ declare ii integer; begin II:=1; FOR ii IN 1..10000000 LOOP INSERT INTO ipm_model_history_data (res_model, res_id) VALUES (116, ii); end loop; return true; end; $BODY$ LANGUAGE plpgsql; select * from creatData2() as tab;
插入1千萬(wàn)條數(shù)據(jù)耗時(shí)610s,當(dāng)然字段不多的情況下。
補(bǔ)充:Postgresql存儲(chǔ)過(guò)程--更新或者插入數(shù)據(jù)
要記錄某一時(shí)段機(jī)器CPU、內(nèi)存、硬盤(pán)的信息,展示的時(shí)間粒度為分鐘,但是為了精確,輸入數(shù)據(jù)源的時(shí)間粒度為6s。這個(gè)統(tǒng)計(jì)過(guò)程可以在應(yīng)用層做好,每分鐘插入一次,也可以在數(shù)據(jù)庫(kù)層寫(xiě)個(gè)存儲(chǔ)過(guò)程來(lái)完成,根據(jù)傳入數(shù)據(jù)的時(shí)間來(lái)判斷是更新數(shù)據(jù)庫(kù)舊數(shù)據(jù)還是插入新數(shù)據(jù)。
同時(shí),這些數(shù)據(jù)只需要保留一周,更老的數(shù)據(jù)需要被刪除。刪除動(dòng)作可以每天定時(shí)執(zhí)行一次,也可以寫(xiě)在存儲(chǔ)過(guò)程中每次檢查一下。
考慮到性能在此時(shí)沒(méi)什么太大約束,而后面存儲(chǔ)過(guò)程的接口方式更漂亮些,不用應(yīng)用層去關(guān)心數(shù)據(jù)到底組織成什么樣,因此實(shí)現(xiàn)了一個(gè)如下:
Postgresql V8.3 CREATE OR REPLACE FUNCTION insert_host_status(_log_date timestamp without time zone, _host inet, _cpu integer, _mem integer, _disk integer) RETURNS void AS $BODY$ DECLARE new_start timestamp without time zone; current_start timestamp without time zone; c_id integer; c_log_date timestamp without time zone; c_cpu integer; c_mem integer; c_disk integer; c_count integer; date_span interval; BEGIN -- insert or update SELECT id, log_date, cpu, mem, disk, count INTO c_id, c_log_date, c_cpu, c_mem, c_disk, c_count FROM host_status_byminute WHERE host=_host ORDER BY id DESC limit 1; SELECT timestamp_mi(_log_date, c_log_date) INTO date_span; IF date_span >= '00:00:60' OR c_id IS NULL THEN INSERT INTO host_status_byminute (log_date, host, cpu, mem, disk, count) values (_log_date, _host, _cpu, _mem, _disk, 1); ELSIF date_span >= '-00:00:60' THEN c_mem := ((c_mem * c_count) + _mem)/(c_count + 1); c_cpu := ((c_cpu * c_count) + _cpu)/(c_count + 1); c_disk := ((c_disk * c_count) + _disk)/(c_count + 1); c_count := c_count + 1; UPDATE host_status_byminute SET mem=c_mem, cpu=c_cpu, disk=c_disk, count=c_count WHERE id=c_id; END IF; -- delete old data SELECT date_mii(date(now()), 6) INTO new_start; SELECT date(log_date) from host_status_byminute limit 1 INTO current_start; -- omit a bug happened when date is disordered. IF new_start > current_start THEN DELETE FROM host_status_byminute where log_date < new_start; END IF; END; $BODY$ LANGUAGE 'plpgsql' VOLATILE COST 100; ALTER FUNCTION insert_host_status(timestamp without time zone, inet, integer, integer, integer) OWNER TO dbuser_test;
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
PostgreSQL創(chuàng)建自增序列、查詢序列及使用序列代碼示例
數(shù)據(jù)庫(kù)中主鍵的生成一般是通過(guò)序列來(lái)生成,下面這篇文章主要給大家介紹了關(guān)于PostgreSQL創(chuàng)建自增序列、查詢序列及使用序列的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11PostgreSQL的generate_series()函數(shù)的用法說(shuō)明
這篇文章主要介紹了PostgreSQL的generate_series()函數(shù)的用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01Postgresql設(shè)置遠(yuǎn)程訪問(wèn)的方法(需要設(shè)置防火墻或者關(guān)閉防火墻)
這篇文章主要介紹了Postgresql設(shè)置遠(yuǎn)程訪問(wèn)的方法(需要設(shè)置防火墻或者關(guān)閉防火墻),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03PostgreSQL 數(shù)據(jù)庫(kù)性能提升的幾個(gè)方面
PostgreSQL提供了一些幫助提升性能的功能。主要有一些幾個(gè)方面。2009-09-09PostgreSQL 實(shí)現(xiàn)查詢表字段信息SQL腳本
這篇文章主要介紹了PostgreSQL 實(shí)現(xiàn)查詢表字段信息SQL腳本,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01postgresql兼容MySQL on update current_timestamp
這篇文章主要介紹了postgresql兼容MySQL on update current_timestamp問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03