我试图找出一种方法,通过合并相似的条目来减小表的大小,该表的大小正在增长到惊人的大小。我得到了一个有效的“分组依据”查询,它可以按照我的意愿汇总数据,我只是不确定如何删除现有条目并根据该选择语句插入新条目。我想最直接的方法是运行选择,将这些结果保存到内存中,删除表条目,然后插入合并的条目。但这似乎效率低下并且会使用大量内存,希望也许有一种方法可以执行一些 sql 魔术并一次性完成。
这是我的“分组依据”选择:
select SUM(user_in),
SUM(user_out),
SUM(user_total),
name,
device_type,
device_os,
ownership,
host_name
FROM user_usage
GROUP BY name,
device_type,
device_os,
ownership,
host_name;
谢谢!
万一其他人遇到这样的事情,这个函数可以非常有效地完成合并:
CREATE OR REPLACE FUNCTION consolidate_user_bandwidths(
IN _tbl REGCLASS,
IN _savetime TIMESTAMP
) RETURNS void AS
$BODY$
BEGIN
EXECUTE 'CREATE TEMP TABLE user_bandwidths_temp ON COMMIT DROP AS
SELECT MAX(id) AS id, SUM(bandwidth_in) AS bandwidth_in,
SUM(bandwidth_out) AS bandwidth_out,
'''|| _savetime ||'''::timestamp AS created_at,
SUM(bandwidth_total) AS bandwidth_total, name,
device_type, device_os,
ownership, host_name
FROM '|| _tbl ||'
GROUP BY name, device_type,
device_os, ownership, host_name';
EXECUTE 'TRUNCATE TABLE '|| _tbl ||'';
EXECUTE 'INSERT INTO '|| _tbl ||' SELECT * FROM user_bandwidths_temp';
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;