2015-07-22 8 views
6

Postgres Dokumentation sagt, dass die Bedingungen in Tabellenpartitionen nichtIst es sicher, Postgres-Tabellenpartitionierung mit überlappenden Einschränkungen zu verwenden?

Stellen Sie sicher, überlappen sollten, dass die Einschränkungen garantieren, dass es keine Überschneidungen zwischen den Schlüsselwerten ist in verschiedenen Partitionen erlaubt.

aber ich verstehe nicht, warum, weil genaue Partition, die Daten werden durch Trigger in noch entschieden eingefügt werden muss, die sich überlappender Einschränkungen bewusst sein könnte

Ich habe die folgende Situation, eine Tabelle mit eine Menge von Textinformationen und update_date Zeitstempel, diese Tabelle ist viertel geteilt, und alle neuen oder aktualisierten Zeilen gehen in die neueste Partition, Das Problem ist, dass Gin Trigramm-Index zu langsam ist, also möchte ich Trigram-Index für erstellen der aktuelle Tag

derzeit Trigger auf der Master-Tabelle ist verantwortlich für die Erstellung von Parti Ich plane, eine neue Partition für den aktuellen Tag hinzuzufügen, die sich mit der Viertelpartition überschneidet, und ich möchte den Trigramm-Index für die Partition des aktuellen Tages deaktivieren (das erneute Zusammenführen von Daten in die Viertelpartition wäre eine weitere Wartungsaufgabe).

Ich habe versucht, Partitionstabellen manuell mit überlappenden update_date Constraints zu erstellen und postgres hat sich nicht beschweren, ich habe sogar gesucht und beide Tabellen wurden im Plan verwendet, so scheint es gut zu funktionieren, aber Dokumentation sagt, dass Einschränkungen ' t überlappen, warum ist das?

Ist es sicher, Partitionen mit überlappenden Constraint zu erstellen, wenn ich geeignete Trigger und Wartung habe?

UPD:

CREATE TABLE master (text_value text, update_date timestamp); 

CREATE TABLE partition_year (
    CHECK (update_date >= DATE '2015-01-01' AND update_date < DATE '2015-12-31') 
) INHERITS (master); 

CREATE TABLE partition_month (
    CHECK (update_date >= DATE '2015-07-01' AND update_date < DATE '2015-8-01') 
) INHERITS (master); 

-- in production this would be handled by trigger 
insert into partition_year(text_value, update_date) values ('year', '2015-01-02'); 
insert into partition_month(text_value, update_date) values ('month', '2015-07-02'); 

-- this scans only year partition 
explain select * from master where update_date = '2015-01-02'; 

-- this scans both year and month partition 
explain select * from master where update_date = '2015-07-02'; 

dieses Beispiel zeigt, dass Postgres liest sowohl Jahr und Monat partititon und nicht viel kümmern sich um ihre Überlappung

+1

Sehr interessante Frage. Ich bin mir nicht sicher. Der Einschränkungsausschluss funktioniert, um mehrere Tabellen auszuwählen, in denen mehr als eine Tabelle die Einschränkung erfüllt. Daher bin ich mir auch nicht sicher, warum diese Einschränkung gelten soll. Beachten Sie jedoch, dass PostgreSQL alle Partitionen scannt, in denen eine Überschneidung auftritt. –

Antwort

0

Ich nehme an, dass Sie das tun können. In der Dokumentation wird nur das Konzept der Partitionierung als privater Fall der Tabellenvererbung erläutert. In Ihrer Anwendung kann es verschiedene Implementierungen geben. Zum Beispiel können Sie Partitionen erstellen und entscheiden, welche für das Einfügen aus Ihrem Code verwendet werden soll, ohne Trigger in der db selbst zu verwenden. In solchen Fällen sind diese Prüfungen in der Datenbank eine Sicherheitsmaßnahme.