Archivierung von Daten abgeleiteter Tabellen

Moin,

hier erstmal einige Systeminfos:

  • PostgreSQL 8.3.1 on x86_64-unknown-linux-gnu, compiled by GCC gcc (GCC) 4.2.0
  • Datenbestand ca. 30 Millionen Rows/a



    Die Aufgabe besteht darin, Teile des Datenbestandes zu exportieren und die Zeile physikalisch zu löschen.
    Okay, die Daten in eine XML Datei oder in eine Tabelle zu pinseln ist kein Probelem.

Export der Daten:
Select * from t1 join t2 using(pk) join t3 using(pk) join t3 using(pk) where pk=id


Ich suche nach einer einfachen Lösung die Daten bei Bedarf wieder zu importieren.
Meine Idee:
Via Prozedur eine Datei mit Copy oder Insert-Anweisungen zu schreiben.

Dazu brauche ich aber den Name des Schemas der Tabellen sowie die Spaltenname o.g. Select Anweisung.
Die Verwendung des information_schemas hilft mir nicht wirklich weiter.

Frage:
Wie komme ich an die Metainformationen einer SQL Anweisung in PLPGSQL ran?

Any ideas?


THX
Klaup

Klingt stark nach table-partitionierung.

Dazu brauche ich aber den Name des Schemas der Tabellen sowie die Spaltenname o.g. Select Anweisung.
Die Verwendung des information_schemas hilft mir nicht wirklich weiter.

Frage:
Wie komme ich an die Metainformationen einer SQL Anweisung in PLPGSQL ran?

Any ideas?


THX
Klaup

PostgreSQL: Documentation: Manuals: PostgreSQL 8.3: The Information Schema

Andreas

Hi Andreas

die Fragestellung lässt sich vereinfachen:
Folgendes PHP Snippet beschreibt es:
[php]
$res = pg_query($dbconn, “select * from plates join samplevalues using(plateid) where plateid=226”);
$i = pg_num_fields($res);
for ($j = 0; $j < $i; $j++) {
$fieldname = pg_field_name($res, $j);
$tname = pg_field_table($res, $j);
echo "TABLE: $tname -> FIELD: $fieldname
";
}

[/php]Die Funktionen pg_num_fields,pg_field_name,pg_field_table in PLPGSQL nachzubilden wäre Klasse.

Any ideas?
THX

Klaup

… table partitioning …
als lösung der archivierung von daten …

dazu brauchst du dann z.B. trigger (auf loeschen oder loesch-flag) und ne trigger-fkt. welche wiederum das schema “information_schema” verwenden kann um für beliebige tablellen die notwendigen meta-informationen zur erzeugung dynamsichen SQLs zu finden.

mit ein wenig gockle und pg-docu zu obigen begriffen solltest erstmal ein stueck weiter kommen.

Hallo Leute,

“Table Partitioning” ist bei der Archivierung nicht notwendig, da die Daten in keinem funktionalen Zusammenhang stehen sollen.

Den Ansatz, den ich gewählt habe ist:
Schema anlegen CREATE SCHEMA archive
Tabellen anlegen CREATE TABLE (like parent_table)
Daten kopieren

Lsg. des Problems:“Die Funktionen pg_num_fields,pg_field_name,pg_field_table in PLPGSQL nachzubilden.”

CREATE TMP VIEW AS …

Dann die Anweisung mit den Infos vom “information_schema” joinen.
That’s it.


klaup

deine aufgabe lautet: beim loeschen archivieren

die loesung sollte lauten: loesch-trigger -> archivieren

also bleibt nur noch das teil-problem archivieren

und dazu brauchst du nichtmal schema-informationen, wenn die archiv-tabelle exakt die gleiche struktur hat wie die quell-tabelle … weil die werte der DELETED row in OLD sowieso schon die richtigen typen besitzen - in der gleichen reihenfolge wie die spalten in der ziel-tabelle sind … das schoene am insert ist, dass man die spalten auch weglassen kann … einfach insert into archive values (…) - wenn man das “values” in PL/pgsql ueberhaut an dieser stelle braucht

  1. Die Tabellenstruktur ist zum Zeitpunkt des Archivierens gleich
  2. Weiterentwicklung der Quelltabellen
  3. Die Archivtabellen werden sich immer weiter von der Struktur der Quelltabellen entfernen
  4. Import der Archivdaten in die Quelltabellen
    Darin besteht das Kernproblem.

Hat keiner ein ähnliches Szenario?

Klaup