CLUSTER sonrasında REINDEX gerekli mi?


12

CLUSTER kullanarak bir tabloyu bir dizin tarafından yeniden sıralamak için düşünüyorum. Tablo verilerinin bu yeniden oluşturulmasının varolan tüm dizinleri şişkin veya işe yaramaz hale getirdiğini biliyorum. KÜMELENMEDEN sonra REINDEX'in gerekli olduğunu gösteren bazı işaretler gördüm. Ben KÜME belirtmek diğer referanslar buldum yapar bir ANDA. Resmi Belgeler REINDEX CLUSTER parçası olmak ya da (o CLUSTER sonra ANALİZİ çalışıyor önermek rağmen) gerekli hakkında hiç bir şey diyor

Kesinlikle (yani resmi belgelere bir tür atıfta bulunarak) KÜMELENMEDEN sonra REINDEX'in gerekli olup olmadığını söyleyebilir mi?


2
Bunun gerekli olduğunu düşünmüyorum. clustersatırları yeniden konumlandırdığından, dizin bilgilerini yine de güncellemesi gerekir.
a_horse_with_no_name

Evet, ama bulduğum tartışmaların yarısındaki teori, endeksin şişmesine neden oluyor.
AĞAÇ

Yanıtlar:


12

Yeniden endekslemenize gerek yok, çünkü CLUSTERsizin için etkili bir şekilde yapıyor.

Daha spesifik olarak, CLUSTERkaynak tabloyu kilitler ve ardından hedef dizine göre sıralanmış yeni bir kopyasını oluşturur . Yeni kopyada dizinler oluşturur, ardından eski tabloyu ve dizinleri yenileriyle değiştirir.

Bunun VACUUM FULL9.0+ için de geçerli olduğunu unutmayın.

CLUSTERŞişkinlik indekslerini öneren bir tartışma görüyorsanız, CLUSTER9.0 öncesi gibi çalıştığını düşünen insanlar olabilir VACUUM FULL. Eski VACUUM FULLuygulamanın neden olduğu dizin şişkinliğinden bahseden ve alternatifCLUSTER olarak öneren tartışmalar da görüyor ve yanlış okuyor olabilirsiniz .

Bu belgelerde ima edilmektedir :

tablonun dizin sırasına göre tablo verilerini içeren geçici bir kopyası oluşturulur. Tablodaki her bir dizinin geçici kopyaları da oluşturulur . Bu nedenle, diskte en az tablo boyutu ve dizin boyutlarının toplamına eşit boş alana ihtiyacınız vardır.

Söylemediği, ancak yapması gereken, bu geçici kopyaların orijinal tablonun yerini almasıdır . (Kalın benim).


1
CLUSTER'ın dizinleri değiştirdiğine dair referansınız var mı?
AĞAÇ

1
@TREE Eklendi. Belgeler, geçici tablonun ve dizinlerin daha sonra orijinalleri değiştirdiğini açıkça söylemez, ancak bir KÜMERDEN önce / sonra veri dizinine gerçekten bakarsanız veya kaynak kodunu incelerseniz durumun böyle olduğunu görürsünüz.
Craig Ringer

Bunu test ettim ve en azından test senaryomda, dizin dosyası boyutu azaltıldı. Ama bu sadece bir senaryo ve davranış (dizin sayısı, disk üzerindeki toplam boyutu, vb) etkileyen birçok değişken olabilir, bu yüzden basit bir test güvenemiyorum.
AĞAÇ

1
@TREE Olası tüm koşullardaki davranışı anlamada mutlak kesinlik için kaynak kodunu okumanız gerekir. Tek söyleyebileceğim tek şey olan her durum farkında değilim ki CLUSTERyok değil dizinleri yeniden ve gerçek dosyaların incelenmesi base/açıkça yeni gösterecek relfilenodes. Henüz sahip olmadığınız problemlerden endişe duyuyorsunuz.
Craig Ringer

8

Bu konuda a_horse_with_no_name ile beraberim: dizinleri yeniden oluşturmanız gerekmez. CLUSTERBelgelerin bundan bahsetmemesi yanında , REINDEXsayfaya daha da bakabiliriz :

REINDEX'in kullanılabileceği birkaç senaryo vardır:

  • Bir dizin bozuldu ve artık geçerli veriler içermiyor. Teoride bu asla gerçekleşmemesine rağmen, uygulamada dizinler yazılım hataları veya donanım arızaları nedeniyle bozulabilir. REINDEX bir kurtarma yöntemi sağlar.

  • Bir dizin "şişirilmiş" hale geldi, birçok boş veya neredeyse boş sayfa içeriyor. Bu, belirli nadir erişim kalıpları altında PostgreSQL'deki B-ağacı dizinlerinde oluşabilir. REINDEX, son sayfalar olmadan dizinin yeni bir sürümünü yazarak dizinin alan tüketimini azaltmak için bir yol sağlar. Daha fazla bilgi için Bölüm 23.2'ye bakın.

  • Bir dizin için bir depolama parametresini (doldurma faktörü gibi) değiştirdiniz ve değişikliğin tam olarak yürürlüğe girmesini sağlamak istiyorsunuz.

  • CONCURRENTLY seçeneğiyle bir dizin oluşturma başarısız oldu ve "geçersiz" bir dizin bırakıldı. Bu tür dizinler işe yaramaz, ancak REINDEX'i yeniden oluşturmak için kullanmak uygun olabilir. REINDEX'in eşzamanlı derleme yapmayacağını unutmayın. Dizini üretime müdahale etmeden oluşturmak için dizini bırakmalı ve CREATE INDEX CONCURRENTLY komutunu yeniden vermelisiniz.

Açıkçası, CLUSTERbu durumların hiçbirine düşmez.

Ve CLUSTERdokümanlarda küçük bir cümle var :

[kümeleme sırasında] Tablodaki her bir dizinin geçici kopyaları da oluşturulur.

Bu, tablonun kendisi gibi, dizinlerin de işlem sırasında yeniden sıralandığını gösterir - bu şekilde yeniden endekslemeyi işe yaramaz hale getirir.


Öneri kesinlikle var ve testler bunu onaylıyor gibi görünüyor. Docs aslında ben bu davranışa dayanarak daha iyi hissederiz söyledi indeksleri (kalıcı) yeniden edildi.
AĞAÇ

2
Burada bir belge yaması için bir şeyler görüyorum. Kılavuz, dizinleri yeniden oluşturma konusunda daha açık olmalıdır.
Erwin Brandstetter

Bu noktada şüphem, geliştiricilerin bu davranışı resmi olarak belgelemek istemedikleri için kalıcı olarak bu uygulamaya bağlı olmak istemiyorlar.
AĞAÇ

@ÜST sürümler arasında birçok özellik değişikliği vardır ve dokümanlar buna göre değişir (çoğunlukla). Muhtemelen özellikleri de değişir :), bu yüzden hiçbir yerde hiçbir kravat görüyorum.
dezso

@dezso Doğru, ancak belgelenmiş işlevleri kaldırmak konusunda isteksiz olacaklar. Genel olarak belgelerin kalitesi göz önüne alındığında, hala bu davranışın ihmal edilmesinin kasıtlı olduğunu varsayıyorum.
AĞAÇ

5

Disk Alanını Kurtarma bölümünde bir başvuru bulundu .

Böyle bir tablonuz varsa ve kapladığı fazla disk alanını geri kazanmanız gerekiyorsa, VACUUM FULL veya alternatif olarak CLUSTER veya ALTER TABLE'ın tablo yeniden yazma değişkenlerinden birini kullanmanız gerekir . Bu komutlar tablonun tüm yeni bir kopyasını yeniden yazar ve tablo için yeni dizinler oluşturur.


-3

Tüm cevapları analiz etmek, bence bunu yapmanın doğru yolu kümeden ÖNCE yeniden dizine eklemektir. Belgeler kümenin bir reindex yapıp yapmadığını söylemediğinden ve dizinin yalnızca bir kopyası, sipariş edilip edilmediğinden, dizinlenmiş bir dizinin daha iyi kümelenmiş bir tabloyla sonuçlanacağını düşünüyorum. Bundan sonra bir analiz işi bitirecektir. Küme ve / veya reindex ölü kaplumbağaları serbest bırakmazsa, her şeyden önce dolu bir vakum işe yaramaz gibi görünüyor.


Ben kabul cevap söz gibi belgeler gelmez bu indeksleri adil değil KÜME komutu hakkında sayfasında, yeniden inşa edilecek söylüyorlar.
AĞAÇ

Ve her ikisi CLUSTERve VACUUM FULLyepyeni bir fiziksel tablo üretir - basitçe ondan sonra herhangi bir ölü olamaz. Eski kopyanın kullandığı alan işlemin sonunda serbest bırakılacaktır.
dezso

Aslında. Tabloyu ve tüm dizinleri yeniden oluşturur. Ancak Küme'nin tabloyu yeniden sıralamak için kullandığı dizin hakkında bir şüphem var. Önce yeniden endekslenecek veya tabloyu yeniden sıralamak için mi kullanılacak? Ve bundan sonra endeks yeniden yaratılıyor mu? Sorunlu bir indeks bazı sorunlar ... oluşturabilir Çünkü
Aislan Luiz Wendling
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.