Los índices de herencia de Postgres para tablas particionadas


9

Tengo una tabla con aproximadamente 60 millones de filas que he dividido por estado en 53 subtablas. Estas tablas "heredan" la tabla grande así:

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

Mi pregunta es esta: si no construyo los índices en b2b8 hasta después de que se complete la instrucción copy, ¿las subtablas heredan los índices? En otras palabras, quiero hacer esto:

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

Y haga que todo haya creado todos los índices en las subtablas.

Respuestas:


11

Como se explicó anteriormente, INHERITSno copia las definiciones de índice.

Por lo tanto, debe indicar tanto la herencia como la copia de índice.

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

Gracias, @dezso, por tu comentario.



2

A pesar de que los documentos , establece que todos los campos están sincronizados entre la tabla principal y su hijo (copiado antes).

La cláusula opcional INHERITS especifica una lista de tablas de las cuales la nueva tabla hereda automáticamente todas las columnas.

El uso de INHERITS crea una relación persistente entre la nueva tabla secundaria y sus tablas principales. Las modificaciones de esquema a los padres normalmente también se propagan a los niños, y de manera predeterminada, los datos de la tabla secundaria se incluyen en los escaneos de los padres.

Que no incluye índices .

Puede ver los ejemplos en la documentación (o ejecutar algunas pruebas por su cuenta) para ver que necesitará construir estos índices en una tabla secundaria.


Sí, terminé probando algunas compilaciones para probar y "heredar" no da como resultado que las tablas secundarias se indexen después de crearlas si el elemento primario no las tenía en su lugar desde el principio. Desafortunadamente, esto termina ralentizando las grandes importaciones de csv mediante copia.
ABCD EFGHIJK

1

De los documentos: "ME GUSTA .... A diferencia de HEREDAS, la nueva tabla y la tabla original se desacoplan por completo una vez completada la creación. Los cambios en la tabla original no se aplicarán a la nueva tabla"


0

Hice esta función para crear índices en tablas secundarias.

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$;
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.