標籤:
在做伺服器負載狀態監控的時候,為了避免負載峰值而造成無用警示的問題,我用的辦法是取最近10次負載的平均值。之前這個需求直接在django中用程式解決,不過運行一段時間後速度不是很理想。現在解決的思路是先在插入新資料的時候讓資料庫把負載計算好放在另外一個欄位,然後在django中刪除計算每台伺服器負載平均值的代碼,負載值改成直接讀取平均值。因為資料庫伺服器現在壓力不大,增加觸發器後對效能的影響這些就沒怎麼考慮。
計算平均值
PostgreSQL計算平均值的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資料庫中根據某條件,取某欄位的平均值,然後插入到另外一個欄位的實現就完成了。
記錄下。
原文地址:http://www.sijitao.net/2030.html
PostgreSQL根據某欄位取平均值後插入另外欄位實現一例