Otomatik vakum açıksa PostgreSQL veritabanımı manuel olarak VACUUM yapmalı mıyım?


15

Büyük bir PostgreSQL veritabanı (tablo içinde bir milyon satırlarla yoktur) ve geliştiriciler yapar ben kullanan yazılım yapayım diyor VACUUMve ANALYZEperiyodik. Ancak PostgreSQL veritabanı varsayılanı açıktır autovacuum.

Hiç vakum / analiz yapmalı mıyım? Avantajları nelerdir? Otomatik ve manuel vakum arasındaki fark nedir

Örneğin, Pgadmin3'te, bu var:
resim açıklamasını buraya girin

Yanıtlar:


12

ETL'ye kısa bir cevap olmadığını kabul ediyorum. Boyut önemli olan tek şey değil - ağır yük altında oldukça büyük PostgreSQL OLTP Veritabanları (bazı tablolar> 100.000.000 satır ile) çalıştırıyoruz ve şu anda sadece otovakuma güveniyoruz.

Yine de, benim için iki şey önemli görünüyor:

  • Veritabanınızda çok iyi tanımlanmış bir iş yükünüz olmadığı ve ne yaptığınızı tam olarak bilmediğiniz sürece , otovakumun asla kapatılmaması gerektiği konusunda fikir birliği var gibi görünüyor . Ancak, doğal olarak, ek VACUUMve / veya ANALYZEkoşu yapabilirsiniz.

  • Ek VACUUMçalışmaları düşünmeden önce , otovakumun nasıl devam ettiğini kontrol ederim. Herhangi tabloları sorgulayarak Autovacuum eşiğin ötesinde olup olmadığını kontrol edebilirsiniz pg_stat_user_tablesve pg_class. Ben ilgi olabilir başka bir iş parçacığında böyle bir sorgu gönderdi: PostgreSQL Aggressive Autovacuum .

    Ne yazık ki, otoanaliz eşikleri için benzer bir kontrol yapmak o kadar kolay değildir (yani şu anda mümkün değildir). Ancak, autoanalyze varsayılan olarak otovakumdan çok önce başlar ve çok daha ucuzdur. Yani, temel olarak veritabanınız otovakum ile devam edebilir, muhtemelen de otomatik analiz ile iyi olacaktır. Son otomatik analiz tarihleri ​​de sorgulanabilir pg_stat_user_tables.

Yararlı bulduğum bazı (en mükemmel) PostgreSQL belgelerinin bazı bölümleri:


7

Bir şeyi yanlış yapılandırmazsanız, otovakum oldukça iyi örtmelidir . Diğer cevaplar zaten bunu kapsıyor.

Manuel VACUUM (ve daha da önemlisi: manuel ANALYZE) için açıkça tanımlanmış bir durum vardır : geçici tablolar , bunlar otomatik vakum iblisi tarafından dikkate alınmaz. Ben burada kılavuzuCREATE TABLE alıntı :

Autovacuum cin erişemiyor ve bu nedenle vakum veya geçici tablolar analiz edilemez. Bu nedenle, oturum vakum komutları aracılığıyla uygun vakum ve analiz işlemleri gerçekleştirilmelidir. Örneğin, geçici sorgu karmaşık sorgularda kullanılacaksa ANALYZE, geçici tabloyu doldurulduktan sonra çalıştırmak akıllıca olur .


4

Çok fazla faktöre bağlı olduğu için kısa bir cevap yoktur. Sistem yavaş mı? Otomatik vakum aslında bu masaya dokunuyor mu? vb.

İşte bu konuda bazı iyi bağlantılar:

Net bir karar vermek için veritabanının kendisinin anlaşılması ve neler olduğu hakkında daha fazla ayrıntı gerekir.


1

Performans düşüşünü görmeye başlamadığınız sürece manuel olarak vakumlamanız gerektiğini düşünmüyorum. Ancak, vakum ve otovakum ayarlarınızı gözden geçirmenizi ve ihtiyaçlarınıza göre değiştirmenizi şiddetle tavsiye ederim

Mevcut ayarlarınızı görmek için şu sorguyu çalıştırın:

SELECT *
FROM pg_settings 
WHERE name LIKE '%vacuum%'

Alanların çoğu kendiliğinden açıklayıcıdır, ancak işte bunlarla ilgili belgeler: https://www.postgresql.org/docs/current/static/runtime-config-autovacuum.html

Amacınız çöpü tutarlı bir şekilde temizlemek için otovakümü yapılandırmak olmalı, ancak otovakümü sürekli çalıştırmayın.

En önemli ayarlar:

  • autovacuum_vacuum_scale_factor - bir temizleme tetiklenmeden önce ölen kapların yüzdesini belirler. Varsayılan değer = 0.2
  • autovacuum_vacuum_threshold - temizleme tetiklenmeden önce minimum ölü tuple sayısı. Varsayılan değer = 50

Eşik, küçük tablolar için temizleme işleminin çok sık tetiklenmesini önlemeye yardımcı olur.

Çok büyük tablolarınız yoksa, varsayılan ayarlar iyi çalışır. Basitçe söylemek gerekirse, 100GB alan bir masanız varsa, otomatik vakum tetiklenmeden önce 20GB çöp toplayacaksınız. Bu nedenle, genellikle ölçek faktörünü düşük ayarlamanızı öneririm. Kendiniz için ne kadar düşük bir karar vermelisiniz. Mevcut projemde 0.05 kullanıyorum

Eşikler de arttırılabilir. Birçok uygulamada sık sık güncellenen birkaç tablo vardır ve 50 tuple o kadar da değildir. Bunu 1000'e çıkarmak herhangi bir soruna yol açmamalıdır, ancak elbette kendi vakanızı düşünmelisiniz

Ayrıca, otomatik vakumun ince ayarını yapabilir ve bazı tablolarınız için farklı ayarlara sahip olabilirsiniz.

ALTER TABLE your_table SET (autovacuum_vacuum_scale_factor = 0.05);

Scale_factor ve eşikleri yapılandırırsanız iyi olmalısınız. Ayrıca autovacuum_vacuum_cost_limitvarsayılan vacuum_cost_limitolarak 200'e ayarlanmış olan bu değeri artırabilirsiniz. Bu, tüm kaynakları tüketmesine izin vermeyen ve uygulamanızın vakumlama işlemi sırasında bile verilerle çalışmasına izin veren çok önemli bir vakum özelliğidir. , ancak varsayılan değer çok düşük. 1000'e yükseltmek önemli bir gecikmeye yol açmamalı, ancak vakum işleminin çok daha hızlı bitmesine izin verecektir

Tabii ki, vakumu manuel olarak da çalıştırabilirsiniz. En basit durumda, DB'nize sıkça erişilmediğinde her gece tam bir temizlik yapacak basit bir cron işine sahip olabilirsiniz.

Umarım yardımcı olur!

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.