Postgres eredita gli indici per le tabelle partizionate


9

Ho una tabella con circa 60 milioni di righe che ho suddiviso per stato in 53 sotto-tabelle. Queste tabelle "ereditano" il tavolo grande in questo modo:

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

La mia domanda è questa: se non costruisco gli indici su b2b8 fino a quando non viene completata l'istruzione copy, le sotto-tabelle ereditano gli indici? In altre parole, voglio fare questo:

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

E tutto si rivela essere creato tutti gli indici nelle tabelle secondarie.

Risposte:


11

Come spiegato in precedenza, INHERITSnon copia le definizioni dell'indice.

Pertanto, è necessario indicare sia l'ereditarietà sia la copia dell'indice.

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

Grazie, @dezso, per la tua osservazione.



2

Anche se i documenti , afferma che tutti i campi sono sincronizzati tra la tabella padre e il suo figlio (copiato in precedenza).

La clausola INHERITS opzionale specifica un elenco di tabelle da cui la nuova tabella eredita automaticamente tutte le colonne.

L'uso di INHERITS crea una relazione persistente tra la nuova tabella figlio e le sue tabelle padre. Le modifiche dello schema ai genitori normalmente si propagano anche ai figli e, per impostazione predefinita, i dati della tabella figlio sono inclusi nelle scansioni dei genitori.

Esso non comprende gli indici .

Puoi vedere dagli esempi nella documentazione (o eseguire alcuni test da solo) per vedere che dovrai costruire questi indici su una tabella figlio.


Sì, ho finito per provare alcune build da testare e "eredita" non comporta l'indicizzazione delle tabelle figlio dopo la loro creazione se il figlio padre non le ha già installate dall'inizio. Purtroppo questo finisce per rallentare le grandi importazioni di CSV via copia.
ABCD EFGHIJK,

1

Dai documenti: "COME ... A differenza di INHERITS, la nuova tabella e la tabella originale vengono completamente disaccoppiate al termine della creazione. Le modifiche alla tabella originale non verranno applicate alla nuova tabella"


0

Ho creato questa funzione per creare indici su tabelle secondarie.

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$;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.