Apakah ada cara untuk menampilkan pernyataan pembuatan untuk indeks di PostgreSQL


14

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?



1
Ingat untuk menambahkan CONCURRENTLYke CREATE INDEXperintah, sehingga Anda tidak mengambil kunci eksklusif di atas meja.
Craig Ringer

Jawaban:


26

Sebenarnya, cukup permintaan pg_indexestampilan katalog sistem sebagai berikut:

SELECT indexdef FROM pg_indexes WHERE indexname = '...'

dan Anda harus mendapatkan kembali pernyataan SQL yang digunakan untuk mendefinisikannya.


4
Perhatikan bahwa nama indeks hanya unik per skema . Anda mungkin ingin menambahkan AND schemaname = 'myschema'.
Erwin Brandstetter

0

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:

$ pg_dump -F c | pg_restore -I <your_index_name>

4
Jika databasenya besar, ini bisa menjadi berlebihan :) Anda mungkin ingin menambahkan -suntuk mengecualikan data dan, jika diketahui, nama tabelnya -t.
dezso

-1

Lebih sederhana jika Anda menginginkan semuanya (semua indeks) ...

=# SELECT indexdef FROM pg_indexes;

-1

indexdefmasih 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.


Ini sama sekali tidak menjawab pertanyaan.
Laurenz Albe
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.