2017-03-01 2 views
0

Ich versuche, einen Weg zu finden, um die Größe einer Tabelle zu reduzieren, die zu einer alarmierenden Größe durch Konsolidierung ähnlicher Einträge wächst. Ich habe eine funktionierende "Group By" -Abfrage bekommen, die die Daten wie gewünscht aufrollt. Ich bin einfach nicht sicher, wie ich die vorhandenen Einträge löschen und neue hinzufügen kann, basierend auf dieser Select-Anweisung. Ich nehme an, die einfachste Methode wäre das Auswählen, Speichern dieser Ergebnisse im Speicher, Löschen der Tabelleneinträge und Einfügen der konsolidierten Einträge. Aber das scheint ineffizient zu sein und würde eine Menge Speicher benötigen, in der Hoffnung, dass es vielleicht eine Möglichkeit gibt, etwas sql magic auszuführen und dies auf einmal geschehen zu lassen.SQL-Gruppe Nach vorhandenen Zeilen, löschen Sie sie und fügen Sie nach Ergebnissen gruppieren

Das ist meine 'Gruppe von' wählen:

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; 

Dank!

Falls jemand anderes jemals läuft in etwa so aus, erfüllt diese Funktion die Konsolidierung während sehr effizient zu sein:

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

Was sind Ihre RDBMs? –

+1

Wenn Sie viele unerwünschte Duplikate erhalten, sollten Sie sich die Logik Ihres Codes ansehen, der der Tabelle user_usage – SpacePhoenix

+0

Einträge hinzufügt Tabellenschema hinzufügen. – McNets

Antwort

1

Eine mögliche Lösung ist eine weitere Aggregation Tabelle zu verwenden (z .: user_usage_aggregated). Führen Sie regelmäßig Ihre Abfrage aus, und schreiben Sie die Ausgabe in die Aggregationstabelle. Löschen Sie dann die Rohdaten von user_usage.

Wenn Sie die Daten zusammenfassen möchten, müssen Sie die aggregierte Tabelle aktualisieren, anstatt sie einzufügen.

Verwandte Themen