Saya perlu membuat ulang sebuah indeks di PostgreSQL yang telah mengalami kembung indeks. Karena saya memerlukan indeks agar dapat digunakan saat sedang dibuat, saya tidak dapat menggunakan REINDEX. Saya akan membuat ulang indeks dengan nama baru dan kemudian menjatuhkan yang lama. Apakah ada cara untuk melihat pernyataan SQL yang digunakan untuk membuat indeks sehingga saya bisa menyalinnya?
postgresql
index
Rory
sumber
sumber
CONCURRENTLY
keCREATE INDEX
perintah, sehingga Anda tidak mengambil kunci eksklusif di atas meja.Jawaban:
Sebenarnya, cukup permintaan
pg_indexes
tampilan katalog sistem sebagai berikut:dan Anda harus mendapatkan kembali pernyataan SQL yang digunakan untuk mendefinisikannya.
sumber
AND schemaname = 'myschema'
.Ya, pernyataan SQL lengkap untuk membuat ulang indeks ada di katalog sistem. Cara paling sederhana yang dapat saya pikirkan adalah menggunakan pg_dump / pg_restore:
sumber
-s
untuk mengecualikan data dan, jika diketahui, nama tabelnya-t
.Lebih sederhana jika Anda menginginkan semuanya (semua indeks) ...
sumber
indexdef
masih tidak persis sama dengan pernyataan pembuatan dalam kasus indeks parsial. Sebagai contoh jika kita membuat indeks dengan pernyataan berikut:CREATE INDEX item_orgunit_idx ON items (orgunit_id) WHERE type IN ('invoice', 'purchaseorder', 'beanpayment');
postgres akan menghasilkan indexdef berikut:
CREATE INDEX item_orgunit_idx ON public.items USING btree (orgunit_id) WHERE ((type)::text = ANY ((ARRAY['invoice'::character varying, 'purchaseorder'::character varying, 'beanpayment'::character varying])::text[]))
Meskipun postgres indexdef memiliki semua tipe yang disimpulkan dan mungkin lebih baik, ORM kami membandingkan dua indeks di mana klausa dan menganggapnya berbeda ketika kami membuat skrip migrasi. Yang merupakan masalah bagi kami.
sumber