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
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. –