Indeks warisan Postgres untuk tabel dipartisi

9

Saya memiliki tabel dengan sekitar 60 juta baris yang telah saya partisi berdasarkan negara menjadi 53 sub-tabel. Tabel-tabel ini "mewarisi" tabel besar seperti:

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

Pertanyaan saya adalah ini: jika saya tidak membuat indeks pada b2b8 sampai setelah pernyataan salinan selesai, apakah sub-tabel mewarisi indeks? Dengan kata lain saya ingin melakukan ini:

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

Dan semuanya ternyata telah membuat semua indeks pada sub-tabel.

ABCD EFGHIJK
sumber

Jawaban:

11

Seperti yang dijelaskan sebelumnya, INHERITStidak menyalin definisi indeks.

Karena itu, Anda perlu menyatakan pewarisan dan penyalinan indeks.

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

Terima kasih, @dezso, atas ucapan Anda.

Jonathan Jacobson
sumber
2

Warisan sendiri tidak akan pernah mewarisi indeks. itu akan mewarisi kolom saja.

Hans-Jürgen Schönig
sumber
2

Meskipun dokumen , menyatakan bahwa semua bidang disinkronkan antara tabel induk dan anaknya (disalin sebelumnya).

Klausa INHERIT opsional memilih daftar tabel dari mana tabel baru secara otomatis mewarisi semua kolom.

Penggunaan INHERIT menciptakan hubungan persisten antara tabel anak baru dan tabel induknya. Modifikasi skema untuk orang tua juga biasanya menyebar ke anak-anak, dan secara default data tabel anak disertakan dalam pemindaian orang tua.

Itu tidak termasuk indeks .

Anda dapat melihat dari contoh di dokumentasi (atau menjalankan beberapa tes sendiri) untuk melihat bahwa Anda perlu membuat indeks ini berdasarkan tabel anak.

Fabricio Buzeto
sumber
Ya saya akhirnya mencoba beberapa build untuk menguji dan "inherit" tidak menghasilkan tabel anak diindeks setelah dibuat jika anak orangtua tidak memilikinya di tempat sejak awal. Sayangnya ini akhirnya memperlambat impor csv besar melalui salinan.
ABCD EFGHIJK
1

Dari dokumen: "SEPERTI .... Tidak seperti INHERIT, tabel baru dan tabel asli sepenuhnya dipisahkan setelah penciptaan selesai. Perubahan ke tabel asli tidak akan diterapkan ke tabel baru"

jjanes
sumber
0

Saya membuat fungsi ini untuk membuat indeks pada tabel anak-anak.

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
sumber