postgres 使用存儲過程批量插入數(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千萬條數(shù)據(jù)耗時610s,當然字段不多的情況下。
補充:Postgresql存儲過程--更新或者插入數(shù)據(jù)
要記錄某一時段機器CPU、內存、硬盤的信息,展示的時間粒度為分鐘,但是為了精確,輸入數(shù)據(jù)源的時間粒度為6s。這個統(tǒng)計過程可以在應用層做好,每分鐘插入一次,也可以在數(shù)據(jù)庫層寫個存儲過程來完成,根據(jù)傳入數(shù)據(jù)的時間來判斷是更新數(shù)據(jù)庫舊數(shù)據(jù)還是插入新數(shù)據(jù)。
同時,這些數(shù)據(jù)只需要保留一周,更老的數(shù)據(jù)需要被刪除。刪除動作可以每天定時執(zhí)行一次,也可以寫在存儲過程中每次檢查一下。
考慮到性能在此時沒什么太大約束,而后面存儲過程的接口方式更漂亮些,不用應用層去關心數(shù)據(jù)到底組織成什么樣,因此實現(xiàn)了一個如下:
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;
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
相關文章
PostgreSQL如何查看數(shù)據(jù)庫及表中數(shù)據(jù)占用空間大小詳解
這篇文章主要介紹了PostgreSQL中用于查看數(shù)據(jù)庫和表空間大小的函數(shù),并提供了每個函數(shù)的詳細說明和應用場景,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2025-02-02
PostgreSQL 數(shù)據(jù)同步到ES 搭建操作
這篇文章主要介紹了PostgreSQL 數(shù)據(jù)同步到ES 搭建操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01
PostgreSQL數(shù)據(jù)庫中如何保證LIKE語句的效率(推薦)
這篇文章主要介紹了PostgreSQL數(shù)據(jù)庫中如何保證LIKE語句的效率,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03
PostgreSQL使用JSONB存儲和查詢復雜的數(shù)據(jù)結構
在PostgreSQL中,JSONB是一種二進制格式的JSON數(shù)據(jù)類型,它允許你在數(shù)據(jù)庫中存儲和查詢復雜的JSON數(shù)據(jù)結構,本文給大家介紹了如何使用JSONB類型在PostgreSQL中存儲和查詢復雜的數(shù)據(jù)結構,需要的朋友可以參考下2024-04-04

