PostgreSQL根据某字段取平均值后插入另外字段实现一例

发表时间:2015-08-19 13:24 | 分类:PostgreSQL | 浏览:2,765 次

在做服务器负载状态监控的时候,为了避免负载峰值而造成无用报警的问题,我用的办法是取最近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数据库中根据某条件,取某字段的平均值,然后插入到另外一个字段的实现就完成了。

记录下。

本文标签:

本文链接:https://www.sijitao.net/2030.html

欢迎您在本博客中留下评论,如需转载原创文章请注明出处,谢谢!

现在只有1个回复
Comment (1)
Trackbacks (0)
  1. 御坂网络  ( 2015.08.20 10:49 ) : #-9

    支持博主继续捣鼓

  1. 还没有Trackbacks
一键脚本 博客历程 留言联系 文章归档 网站地图 谷歌地图
Copyright © 2010-2024 章郎虫博客 All Rights Reserved.