PostgreSQL根據某字段取平均值後插入另外字段實現一例

在作服務器負載狀態監控的時候,爲了不負載峯值而形成無用報警的問題,我用的辦法是取最近10次負載的平均值。以前這個需求直接在django中用程序解決,不過運行一段時間後速度不是很理想。如今解決的思路是先在插入新數據的時候讓數據庫把負載計算好放在另一個字段,而後在django中刪除計算每臺服務器負載平均值的代碼,負載值改爲直接讀取平均值。由於數據庫服務器如今壓力不大,增長觸發器後對性能的影響這些就沒怎麼考慮。html

計算平均值

PostgreSQL計算平均值的sql相似以下:sql

with s as (select cast(load_15 as float) from asset_serverstatus where sid_id=10 order by id desc limit 10) select avg(load_15) from s

觸發器函數

CREATE OR REPLACE FUNCTION fn_status_loadavg_insert()
 RETURNS trigger AS
$BODY$
BEGIN
 update asset_serverstatus set load_avg=(
 with s as (select cast(load_15 as float) from asset_serverstatus where sid_id=new.sid_id order by id desc limit 10) select avg(load_15) from s
 ) where id=new.id;
return new;
END;
$BODY$
 LANGUAGE plpgsql VOLATILE
 COST 100;

用pgsql寫了個觸發器的函數,基本思路其實就是更新。數據庫

爲表添加觸發器

CREATE TRIGGER trg_status_loadavg_insert
 AFTER INSERT
 ON asset_serverstatus
 FOR EACH ROW
 EXECUTE PROCEDURE fn_status_loadavg_insert();

這樣PostgreSQL數據庫中根據某條件,取某字段的平均值,而後插入到另一個字段的實現就完成了。django

記錄下。服務器

原文地址:http://www.sijitao.net/2030.html函數

相關文章
相關標籤/搜索