Postgres hérite des index des tables partitionnées

9

J'ai une table avec environ 60 millions de lignes que j'ai partitionnées par état en 53 sous-tables. Ces tables "héritent" de la grande table comme ceci:

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

Ma question est la suivante: si je ne crée pas les index sur b2b8 avant la fin de l'instruction copy, les sous-tables héritent-elles des index? En d'autres termes, je veux faire ceci:

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

Et faites en sorte que le tout se soit avéré avoir créé tous les index des sous-tables.

ABCD EFGHIJK
la source

Réponses:

11

Comme expliqué précédemment, INHERITSne copie pas les définitions d'index.

Par conséquent, vous devez indiquer à la fois l'héritage et la copie d'index.

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

Merci, @dezso, pour ta remarque.

Jonathan Jacobson
la source
2

INHERITS lui-même n'héritera jamais des index. il héritera uniquement des colonnes.

Hans-Jürgen Schönig
la source
2

Même si les documents indiquent que tous les champs sont synchronisés entre la table parent et son enfant (copiés auparavant).

La clause INHERITS facultative spécifie une liste de tables dont la nouvelle table hérite automatiquement de toutes les colonnes.

L'utilisation de INHERITS crée une relation persistante entre la nouvelle table enfant et ses tables parents. Les modifications de schéma des parents se propagent normalement également aux enfants et, par défaut, les données de la table enfant sont incluses dans les analyses des parents.

Il n'inclut pas les index .

Vous pouvez voir dans les exemples de la documentation (ou exécuter vous-même quelques tests) pour voir que vous devrez créer ces index sur une base de table enfant.

Fabricio Buzeto
la source
Oui, j'ai fini par essayer certaines versions à tester et "hérite" n'entraîne pas l'indexation des tables enfants après leur création si l'enfant parent ne les avait pas déjà en place depuis le début. Malheureusement, cela finit par ralentir les grandes importations csv via la copie.
ABCD EFGHIJK
1

Extrait des documents: "COMME .... Contrairement à INHERITS, la nouvelle table et la table d'origine sont complètement découplées une fois la création terminée. Les modifications apportées à la table d'origine ne seront pas appliquées à la nouvelle table"

jjanes
la source
0

J'ai fait cette fonction pour construire des index sur des tables enfants.

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
la source