PostgreSQL根據某欄位取平均值後插入另外欄位實現一例

來源:互聯網
上載者:User

標籤:

在做伺服器負載狀態監控的時候,為了避免負載峰值而造成無用警示的問題,我用的辦法是取最近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根據某欄位取平均值後插入另外欄位實現一例

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.