在作服務器負載狀態監控的時候,爲了不負載峯值而形成無用報警的問題,我用的辦法是取最近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函數