Postgres erben Indizes für partitionierte Tabellen

8

Ich habe eine Tabelle mit ungefähr 60 Millionen Zeilen, die ich nach Status in 53 Untertabellen unterteilt habe. Diese Tabellen "erben" die große Tabelle wie folgt:

CREATE TABLE b2b_ak (LIKE b2b including indexes, CHECK ( state = 'AK') ) INHERITS (b2b8) TABLESPACE B2B;

Meine Frage lautet: Wenn ich die Indizes auf b2b8 erst nach Abschluss der Kopieranweisung erstelle, erben die Untertabellen die Indizes? Mit anderen Worten, ich möchte dies tun:

Create b2b8
Create b2b8_ak inherits b2b8
COPY b2b8 FROM bigcsvfile.csv
CREATE INDEX CONCURRENTLY

Und es hat sich herausgestellt, dass das Ganze alle Indizes für die Untertabellen erstellt hat.

ABCD EFGHIJK
quelle

Antworten:

11

INHERITSKopiert keine Indexdefinitionen , wie zuvor erläutert .

Daher müssen Sie sowohl die Vererbung als auch das Kopieren des Index angeben.

    CREATE TABLE sub_tab (LIKE tab INCLUDING ALL) INHERITS (tab);

Vielen Dank, @dezso, für Ihre Bemerkung.

Jonathan Jacobson
quelle
2

INHERITS selbst erbt niemals Indizes. Es werden nur Spalten geerbt.

Hans-Jürgen Schönig
quelle
2

Obwohl in den Dokumenten angegeben , dass alle Felder zwischen der übergeordneten Tabelle und ihrem untergeordneten Element synchronisiert sind (zuvor kopiert).

Die optionale INHERITS-Klausel gibt eine Liste von Tabellen an, von denen die neue Tabelle automatisch alle Spalten erbt.

Durch die Verwendung von INHERITS wird eine dauerhafte Beziehung zwischen der neuen untergeordneten Tabelle und ihren übergeordneten Tabellen hergestellt. Schemaänderungen an den übergeordneten Elementen werden normalerweise auch an untergeordnete Elemente weitergegeben. Standardmäßig werden die Daten der untergeordneten Tabelle in die Scans der übergeordneten Elemente einbezogen.

Es enthält keine Indizes .

Sie können den Beispielen in der Dokumentation entnehmen (oder einige Tests selbst ausführen), um festzustellen, dass Sie diese Indizes auf der Basis einer untergeordneten Tabelle erstellen müssen.

Fabricio Buzeto
quelle
Ja, ich habe am Ende einige Builds zum Testen ausprobiert und "erbt" führt nicht dazu, dass die untergeordneten Tabellen nach dem Erstellen indiziert werden, wenn das übergeordnete Kind sie nicht bereits von Anfang an eingerichtet hat. Leider verlangsamt dies große CSV-Importe per Kopie.
ABCD EFGHIJK
1

Aus den Dokumenten: "LIKE .... Im Gegensatz zu INHERITS werden die neue Tabelle und die ursprüngliche Tabelle nach Abschluss der Erstellung vollständig entkoppelt. Änderungen an der ursprünglichen Tabelle werden nicht auf die neue Tabelle angewendet."

jjanes
quelle
0

Ich habe diese Funktion erstellt, um Indizes für untergeordnete Tabellen zu erstellen.

CREATE OR REPLACE FUNCTION index_children (col_name text, parent_name text, index_type text) RETURNS void LANGUAGE plpython3u AS
$_function$
    children = plpy.execute("SELECT c.relname AS child FROM pg_inherits JOIN pg_class AS c ON (inhrelid=c.oid) JOIN pg_class as p ON (inhparent=p.oid) where p.relname = '" + parent_name + "'")
    prog = len(children)
    count = 0
    for child in children:
        if count % 10 == 0:
            plpy.notice('%s : %s / %s' % (child['child'], str(count), str(prog)))
        plpy.execute("Create index on %s using %s (%s)" % (child['child'], index_type, col_name))
        count += 1
    plpy.notice('DONE')
$_function$;
Sean
quelle