User Tools

Site Tools


wiki:postgres:pg_tune_kurs_vererbung

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

wiki:postgres:pg_tune_kurs_vererbung [2017/09/28 12:21] (current)
Line 1: Line 1:
 +====== Vererbung und Tabellen-Partitionierung ======
  
 +Es ist **beliebig tiefes Vererben** möglich.\\
 +Die einzelnen Tabellen sind über eine **Vererbungsstruktur** verbunden.\\
 +FIXME Zur Übung Tabellen mit Vererbung anlegen. Die Tabellen haben einen Schlüssel, ein Datumsfeld und ein Datenfeld und sind nach Jahren getrennt.\\
 +
 +  test# CREATE TABLE t_data(id int4, t date, z int4);
 +  test# CREATE TABLE t_data_2007() INHERITS (t_data);
 +  test# CREATE TABLE t_data_2008() INHERITS (t_data);
 +  test# CREATE TABLE t_data_2009() INHERITS (t_data);
 +  ​
 +  test# INSERT INTO t_data_2007 VALUES (1,'​1-1-2007'​);​
 +  test# INSERT INTO t_data_2008 VALUES (1,'​1-1-2008'​);​
 +  test# INSERT INTO t_data_2009 VALUES (1,'​1-1-2009'​);​
 +  ​
 +  test# INSERT INTO t_data_2007 SELECT * FROM t_data_2007;​
 +  test# INSERT INTO t_data_2007 SELECT * FROM t_data_2007;​
 +  ... um ein paar Datensätze zu erhalten
 +
 +  test# EXPLAIN SELECT * FROM t_data WHERE  t > '​2009-01-01';​
 +  Der Query Planer sucht alle Tabellen durch, da er natürlich nicht weiß daß die Daten des Jahres 2008 in der Tabelle t_data_2008 sind.
 +  ​
 +  test# ALTER TABLE t_data_2007 ADD CHECK (t < '​2008-01-01'​);​
 +  test# ALTER TABLE t_data_2008 ADD CHECK (t > '​2007-12-31'​ AND t < '​2009-01-01'​);​
 +  test# ALTER TABLE t_data_2009 ADD CHECK (t > '​2008-12-31'​);​
 +  test# \d t_data_2007
 +
 +  ​
 +  Jetzt weiß der Query Planer in welchen Tabellen er bei einer Suche nicht nachzuschauen braucht.
 +  Allerdings muß das "​CHECK-Kriterium"​ für den Planer verständlich sein (kein implizites Wissen)
 +  und in der Abfrage als WHERE Bedingung inkludiert sein!
 +  test# EXPLAIN SELECT * FROM t_data WHERE  t > '​2009-01-01';​
 +   ​...date_part('​year',​t) = 2009 funktioniert zum Beispiel nicht!
 +
 +**Die Unterscheidungs-Kriterien für den CHECK müßen nicht scharf sein - unscharfe Grenzen (Überlappungen) sind erlaubt.**\\
 +Jede Tabelle der Vererbungsstruktur wird im Query Planer seperat geplant.
 +
 +  test# SELECT * FROM ONLY t_data;
 +
 +**Daten die nicht mehr benötigt werden unter '​t_old'​ archivieren OHNE AUCH NUR EINEN BYTE DATEN ZU VERSCHIEBEN!**
 +  test# SELECT * FROM  pg_inherits;​
 +  test# CREATE TABLE t_old (LIKE t_data INCLUDING INDEXES EXCLUDING CONSTRAINTS INCLUDING DEFAULTS);
 +  test# ALTER TABLE t_data_2008 NO INHERIT t_data;
 +  test# ALTER TABLE t_data_2008 INHERIT t_old;
 +  test# SELECT * FROM  pg_inherits;​
 +
 +===== Daten einfügen =====
 +Einen Trigger auf die Muttertabelle setzen. Ist allerdings langsamer als wenn man die Tabellen von unten her (direkt in den Kind-Tabellen) befüllt. Natürlich hängt dies vom Anwendungsfall ab, aber es ist daher meist besser (weil schneller) wenn man in der Applikation schon Bescheid weiß wo die Daten hingehören.\\
 +**Jedenfalls sollte man sich die SELECT-Statements auf Vererbungsstrukturen mit EXPLAIN anschauen ob sie auch so funktionieren wie man sich das vorstellt.**
wiki/postgres/pg_tune_kurs_vererbung.txt · Last modified: 2017/09/28 12:21 (external edit)