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函数

相关文章
相关标签/搜索