PostgreSQL Vacuum
PostgreSQL Vacuum,Postgres üzerinde bir tablo da update ve delete işlemleri yapıldığında değiştirilen(update) veya silinen(delete) datalar tutulur. Örneğin siz bir tablo da update işlemi yaptığınız da güncelleyeceğiniz data gizlenir ve yeni değeri insert edilir. Delete işleminde ise silinmek istenen tablo silindi olarak işaretlenir ilgili kayıt gizlenir ama disk üzerinden silinmez.
Update işleminde ise update edilmek istenen kaydı kullanılmaması için gizler ve yeni değeri tabloya insert edilir fakat gizlenen data disk üzerinde durur. Bu disk üzerinde eski dataların kalmasına da “dead rows” denir.
Dead row kavramından bahsettik bu dead rowların vacuum ile ne ilgisi olduğundan bahsedelim. Dead rowlar kaldığı sürece disk üzerinde gereksiz alan kaplar ve bundan dolayı sorgularımızda bu dead rowlar da taranacağından dolayı sorgu süresi ve costları artacaktır. Bunlar belirli periyodlarla vacuum yapılarak boşaltılır ve gereksiz taramanın ve gereksiz costun önüne geçilmiş olur.
VACUUM
Dead rowlardan yukarıda bahsetmiştim. Vacuum işlemi dead rowlar’ın tekrar kullanılabilmesi için işaretlemeleri yapar. İşaretlemeler yapılırken exclusive lock konulmadığı için işlemler yapılabilir. Bu işlem sırasında dead rowlar fazla silinmez ve bundan dolayı disk boyutundan fazla kazanç elde edilmez. Dead Rowları yeniden kullanılacak halde hazır tutulmasını sağlar. AUTOVACUUM özelliği ile otomatik şekilde yapılabilir.
ANALYZE
VACUUM ANALYZE= VACUUM+ANALYZE
Sorgular çalıştırılırken kendilerine sorgu başladığında başlayan ve bittiğinde biten ,sorguyu en hızlı yoldan getirmek için yaşam döngüsü oluştururlar ve bu yaşam döngüsüne postgresql tarafında planner denilir. ANALYZE komutu ile bütün tablo da ya da sadece ilgili tabloda istatistikleri güncelleyebilirsiniz.
VACUM ANALYZE , tabloda silinen ,güncellenen datalar ile işlem yapılmaması için ilgili tabloların istatistiklerini güncelleyerek sorguların kısa sürede gelmesini ve ilgili dead rowları temizlemeyi sağlar.
Bu işlem tabloda read lock a neden olabilir.
VACUM FULL
Vacum full komutu çalıştırıldığı tablo da exclusive lock’a(vacuum full işlemi tamamlanana kadar işlem yaptırılmaması) neden olur . Diğerlerinden farklı olarak çalıştırıldığı tablo ya da veritabanındaki deadrowlar temizlenir ve istatistikler güncellenir. Bundan dolayı diğer vacuum çeşitlerinden daha fazla yer ve performans kazancı elde etmenize imkan tanır.
VACUUM işlemlerinde VERBOSE komutu ile VACUUM sırasında yapılan işlemler hakkında çıktı alabilirsiniz.
Vacuum işlemleri ile tablonun fiziksel olarak tutulan fsm ve vm dosyaları temizlenir.
Fsm : free space mapping olarak geçmektedir . Tablonuzdaki boş kayıtlar burada tutularak yeni bir veri geldiğinde fsm üzerinden belirlenerek yazma işlemi yapılır. Fsm üzerinde yer varsa fsm’e yok ise yeni bir page yazılır. Aşağıdaki sorgu ile fsm ile ilgili daha detaylı bilgi edinebilirsiniz.
Select*from pg_freespace(tablo_adi)
Vm : Visibility mapping update delete işlemlerinde değiştirilerek hangi datanın görülür veya görünemez olduğu bilgisi tutulur. Aşağıdaki sorgu ile vm ile ilgili daha detaylı bilgi edinebilirsiniz.
Select*from pg_visibilty(tablo_adi)
Tabloların ne zaman analyze,autovacuum yaptığı bilgilerini aşağıdaki sorgu ile görebilirsiniz.
SELECT relname,last_vacuum, last_autovacuum, last_analyze, last_autoanalyze FROM pg_stat_user_tables;
Postgresql.conf içerisinde autovacuum ile ilgili parametreleri detaylıca öğrenmek isterseniz Postgresql Tablo AutoVacuum Parametreleri yazıma göz atabilirsiniz.