在作服务器负载状态监控的时候,为了不负载峰值而形成无用报警的问题,我用的办法是取最近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函数