PostgreSQL'de bir dizin için oluşturma deyimini göstermenin bir yolu var mı


14

Ben dizin bloat acı çekti PostgreSQL bir dizin yeniden oluşturmanız gerekir. Dizinin oluşturulurken kullanılabilir olması gerektiğinden REINDEX'i kullanamıyorum. Dizini yeni bir adla yeniden oluşturacağım ve eskisini bırakacağım. Ben sadece kopyalayabilirsiniz böylece bir dizin oluşturmak için kullanılan SQL deyimi görmek için herhangi bir yolu var mı?



1
Eklemeyi unutmayın CONCURRENTLYiçin CREATE INDEXmasaya özel bir kilit yapmayız böylece, komuta.
Craig Ringer

Yanıtlar:


26

Aslında, pg_indexessistem kataloğu görünümünü aşağıdaki gibi sorgulayın :

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

ve tanımlamak için kullanılan SQL ifadesini geri almalısınız.


4
Dizin adlarının yalnızca şema başına benzersiz olduğunu unutmayın . Eklemek isteyebilirsiniz AND schemaname = 'myschema'.
Erwin Brandstetter

0

Evet, dizini yeniden oluşturmak için tam SQL deyimi sistem kataloğundadır. Düşünebildiğim en basit yol pg_dump / pg_restore kullanmaktır:

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

4
Veritabanı büyükse, bu bir overkill olabilir :) -sDışlama verilerini ve biliniyorsa tablo adını ile eklemek isteyebilirsiniz -t.
dezso

-1

Daha basitçe hepsini istiyorsanız (tüm dizinler) ...

=# SELECT indexdef FROM pg_indexes;

-1

indexdef, kısmi bir dizinde hâlâ oluşturma deyimi ile tam olarak aynı değildir. Örneğin, aşağıdaki ifadeyle bir dizin oluşturursak: CREATE INDEX item_orgunit_idx ON items (orgunit_id) WHERE type IN ('invoice', 'purchaseorder', 'beanpayment');

postgres aşağıdaki indexdef dosyasını oluşturur: 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[]))

Her ne kadar postgres indexdef tüm çıkarım türlerine sahipse ve muhtemelen daha iyi olsa da, ORM'miz iki dizini karşılaştırıyor ve geçiş komut dosyaları oluşturduğumuzda bunun farklı olduğunu düşünüyor. Bu bizim için bir problem.


Bu soruya hiç cevap vermiyor.
Laurenz Albe
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.