O Postgres herda índices para tabelas particionadas


9

Eu tenho uma tabela com aproximadamente 60 milhões de linhas que particionei por estado em 53 sub-tabelas. Essas tabelas "herdam" a tabela grande da seguinte maneira:

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

Minha pergunta é a seguinte: se eu não construir os índices no b2b8 até depois que a instrução copy for concluída, as sub-tabelas herdarão os índices? Em outras palavras, eu quero fazer isso:

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

E tudo acabou criando todos os índices nas sub-tabelas.

Respostas:


11

Como explicado anteriormente, INHERITSnão copia definições de índice.

Portanto, você precisa declarar a herança e a cópia do índice.

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

Obrigado, @dezso, pela sua observação.



2

Mesmo com a documentação , afirma que todos os campos são sincronizados entre a tabela pai e seu filho (copiados antes).

A cláusula opcional INHERITS especifica uma lista de tabelas da qual a nova tabela herda automaticamente todas as colunas.

O uso de INHERITS cria um relacionamento persistente entre a nova tabela filha e suas tabelas pai. As modificações de esquema no (s) pai (s) normalmente se propagam também para os filhos e, por padrão, os dados da tabela filho são incluídos nas varreduras do (s) pai (s).

Ele não inclui índices .

Você pode ver nos exemplos da documentação (ou executar alguns testes por conta própria) para verificar se precisará criar esses índices com base na tabela filha.


Sim, acabei testando algumas compilações para testar e "herda" não resulta na indexação das tabelas filhas após a criação, se o filho pai ainda não as tiver no lugar desde o início. Infelizmente, isso acaba desacelerando grandes importações de CSV via cópia.
ABCD EFGHIJK

1

Dos documentos: "COMO ... Ao contrário de INHERITS, a nova tabela e a tabela original são completamente dissociadas após a conclusão da criação. Alterações na tabela original não serão aplicadas à nova tabela"


0

Eu fiz essa função para criar índices em tabelas filho.

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$;
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.