2017-03-01 11 views
0

同様のエントリを統合することによって、驚くべきサイズになっているテーブルのサイズを縮小する方法を見つけようとしています。私は、私が望むようにデータをロールアップする作業のGroup Byクエリを得ました。既存のエントリを削除し、そのselect文に基づいて新しいエントリを挿入する方法がわかりません。私は、最も直接的なアプローチがselectを実行し、その結果をメモリに保存し、テーブルエントリを削除してから、統合エントリを挿入すると仮定します。しかし、それは非効率的で、多量のメモリを使用して、おそらくいくつかのSQLマジックを実行し、これをすべて一度に行う方法があることを望みます。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; 
+0

RDBMとは何ですか? –

+1

不要な重複がたくさんある場合は、user_usageテーブル – SpacePhoenix

+0

テーブルスキーマにエントリを追加するコードのロジックを調べる必要があります。 – McNets

答えて

1

可能な解決策は、別の集計テーブルを使用することです(例えば:user_usage_aggregated)。 定期的にクエリを実行し、出力を集計テーブルに書き込みます。次に、user_usageから生データを削除します。

データの集計を続ける場合は、集計テーブルを挿入するのではなく、集計テーブルを更新する必要があります。

関連する問題