2011-05-26 35 views
29

Geçici olarak devre dışı bırakmak istediğim bir tablodaki bir dizinim var, ancak bunun mümkün olduğunu belirten herhangi bir belge bulamıyorum.Postgres'te bir dizinin geçici olarak devre dışı bırakılması mümkün mü?

Sebep: Hızlanmak üzere tasarlandığından hiçbiriyle ilgili olmayan sorgularda sorunlara neden olabilecek bir dizin var. Bu yeni bir dizin ve bir bütün olarak sistem tanıtıldığından beri daha yavaş görünüyor. Sadece suçlu olarak güvenilir bir şekilde ortadan kaldırmak istiyorum ve bu en kolay yol gibi görünüyor, diğer çözüm önerileri yanı sıra daha iyi soru önerileri, aynı zamanda hoş geldiniz. Ölü basit ondan kurtarma yapmak için bir işlem yapabilirsiniz gerçi sanmıyorum

cevap

40

Sen bir dizin devre dışı bırakmak için Sistem kataloğu halledeceksin: Bu indeks sorguları için kullanılmayacaktır ancak yine güncellenecek demektir

update pg_index set indisvalid = false where indexrelid = 'test_pkey'::regclass 

. Eşzamanlı dizin oluşturma için kullanılan bayraklardan biridir. Endeksin hala güncellenip güncellenmediğini görmek için hızlı bir test yaptığımı unutmayın.

+1

Dizinde de güncellemeleri devre dışı bırakmak mümkün mü? – schmichael

+5

@schmichael Eğer "yanlış" ayarını yanlış yaparsanız, bu güncelleştirmeleri devre dışı bırakır: http://www.postgresql.org/docs/current/static/catalog-pg-index.html – araqnid

+1

Ayrıca, ilgili kısıtlamaları da dikkate almalısınız Buna: http://serverfault.com/questions/300123/how-to-edit-system-catalogs-in-postgresql-8-1/ –

21
begin; 
drop index foo_ndx; 
explain analyze select * from foo; 
rollback; 

, birini devre dışı bırakmak için bir yolu yoktur. Tüm endeksleri devre dışı bırakmak için indexscan'ı da devre dışı bırakabilirsiniz.

Ayrıca, sorgularınızda explain analyze yapıyor olduğunuzdan emin olun.

+0

Teşekkürler. Ne yazık ki benim sorunum, hangi sorguların yavaşlatıldığını bilmemektir: dizini yüklediğim her şey süper hızlıdır, sadece kırılmış bir bütün sistemdir. Bu yüzden, endeksi global olarak birkaç dakika boyunca, sadece bir işlem içinde değil de devre dışı bırakmam gerekiyor. – quodlibetor

+0

Size bir yanıt vermek için tek bir sorgu için bunu yapmanın doğru yolu budur. Sorunumun aptal geneli olmasaydı, onu düzeltirdin. – quodlibetor

+0

Bir “EXPLAIN ANALYZE” kullanma tavsiyesi, neler olduğunu anlamaya başlamaktır. Öyleyse, diyebilirsiniz ki, "INDEX" in varlığı neden bir index_scan'ın X'den Y'ye gitmesine neden oluyor? – Sean

İlgili konular