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?

Rory
sumber
2
stackoverflow.com/questions/25958693
a_horse_with_no_name
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.

TomH
sumber
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>
Egor Rogov
sumber
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;
Michelle Sullivan
sumber
-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.

Tom Lei
sumber
Ini sama sekali tidak menjawab pertanyaan.
Laurenz Albe