0

我试图找出一种方法,通过合并相似的条目来减小表的大小,该表的大小正在增长到惊人的大小。我得到了一个有效的“分组依据”查询,它可以按照我的意愿汇总数据,我只是不确定如何删除现有条目并根据该选择语句插入新条目。我想最直接的方法是运行选择,将这些结果保存到内存中,删除表条目,然后插入合并的条目。但这似乎效率低下并且会使用大量内存,希望也许有一种方法可以执行一些 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;
4

1 回答 1

1

一种可能的解决方案是使用另一个聚合表(例如:user_usage_aggregated)。定期运行查询并将输出写入聚合表。然后从 user_usage 中删除原始数据。

如果要保持汇总数据,则需要更新聚合表而不是插入其中。

于 2017-03-01T21:43:06.337 回答