PostgreSQL Vacuum ve Autovacuum

Ezgi Karahan
3 min readAug 18, 2022

--

Merhaba , bu yazımda vacuum ve autovacuumun gereksinimlerinden ve kullanımlarından bahsedeceğim.

PostgreSQL’de delete ve update işlemi yaptığımızda, delete işleminde satır veri dosyasından hemen kaldırılmaz. Bunun yerine, yalnızca silinmiş olarak işaretlenir. Benzer şekilde updateler de delete + insert olduğu için aynı senaryo orada da gerçekleşecektir.

Bu ölü satırlar temizlenmezse performans ve boyut olarak veritabanına olumsuz yönde etkiler bırakır . Birçok delete ve update işlemleri içeren tablolar için ölü satırlar disk alanının büyük çoğunluğunu kapsayacaktır ve bu yüzden sorgularda yavaşlık yaşanacaktır.

Ölü satırlar tarafından işgal edilen alanı geri almanın ve yeni alanlar için kullanılabilir hale getirmenin yolu, vacuum komutunu manuel olarak çalıştırmaktır.Bu komut, tabloyu tarayacak ve ölü satırları hem tablodan hem de dizinlerden temizleyecektir.

Vacuum full, tablodan ölü alanı temizleyip , geri verir .Ancak bu işlemi kullanmanın bazı dezavantajları vardır.İlk olarak, tüm işlemleri bloke ederek tabloyu kilitler.İkinci olarak, gerekli disk alanını iki katına çıkararak,neredeyse tablonun bir kopyasını oluşturur, bu nedenle zaten disk alanı yetersiz olduğunda yapılabilicek bir işlem değildir.

Vacuum ile ilgili sorun, tamamen manuel bir işlem olmasıdır .Gerektiğinde değil, yalnızca çalıştırmaya karar verdiğimizde gerçekleşir. Bunu cron job olarak tanımlayabilir ve belli periyotlarda tüm tablolarda çalıştırabiliriz , ancak çalıştırmaların çoğunda ölü satırlar temizlenmeyecek ve tek etki sistemde daha yüksek CPU ve I/O kullanımı olacaktır.

Yukarıda bahsettiğimiz vacuum işleminin yol açtığı problemler, autovacuumun kullanımına neden ihtiyacımız olduğunun cevabıdır. Autovacuum , boşa harcanan alan miktarını kontrol altında tutmak için ölü satır temizliğini gerekli durumlarda yapar. Veritabanı, zaman içinde kaç tane ölü satır üretildiğini bilir ve bu sayede, tablo belirli sayıda ölü satır biriktirdiğinde temizlemeyi tetikleyebilir.

Yapmanız gereken ilk şey, varsayılan olan autovacuumun açık olduğundan emin olmaktır.

Autovacuum, ne zaman ve ne sıklıkta çalışması gerektiğini belirlemek için istatistik toplayıcısına da ihtiyacı vardır.Bunun için track_counts’un açık olup olmadığını kontrol etmeniz gerekmektedir.

Autovacuum’un herhangi bir tabloda vacuum komutunu ne sıklıkta çalıştıracağını belirleyen temel faktörler autovacuum_vacuum_threshold ve autovacuum_vacuum_scale_factor’dür.

Varsayılan olarak threshold 50 satırdır ve scale faktörü %20'dir.

Bu, en az 50 satırın ölü olarak işaretlenmesi koşuluyla, ölü satır sayısı tablodaki tüm satırların %20'sini geçer geçmez bir tablonun vakumlanacağı anlamına gelir.

Aşağıdaki komutları kullanarak database için verilen değerleri görebilirsiniz.

Ölü satırların sayısı thresholdu aştığında, autovacuum bir vacuum çalıştırmasını başlatır. Vacuumlamanın gerekli olup olmadığına karar vermek için aşağıdaki formül kullabilirsiniz :

vacuum dead tuples = vacuum base threshold + vacuum scale factor * number of tuples

Tablo özelinde bu istatiktikleri görmek için aşağıdaki komutu kullanabilirsiniz.

Örnek olarak bu tabloda last_autovacuum, last_vacuum , vacuum_count ve autovacuum_count değerlerinin herhangi birinden daha önce tablonun vacuumlandığını anlayabiliriz. Fakat hala dead tuple sayısı fazla ve daha sık vacuum işleminin gerçekleşmesine ihtiyaç var ise autovacuumun tetiklenmesi için scale factor ve threshold değerlerini tabloya göre set etmemiz gerekmektedir.

Aşağıdaki komutlar ile set işlemlerini gerçekleştirebilirsiniz.

Sevgiler 💛

Referans

PostgreSQL 14 Administration Cookbook

--

--