PostgreSQL'de DB Bakım Komutları: Analyze, ReIndex, Vacuum

ANALYZE

ANALYZE 

Bir tablodaki veya veritabanındaki tüm veya birkaç sütunun içeriği hakkındaki istatistikleri toplar. Bu istatistikler daha sonra, sorgu planlayıcısı tarafından sorgular için verimli yürütme planları üretmek üzere kullanılır.

Örnekler:

  • ANALYZE Orders; Orders tablosu için istatistik toplar .
  • ANALYZE VERBOSE Orders; işleme ait ilerleme mesajlarını ekrana basar.
  • ANALYZE Orders (Id, CustomerName); için tablo Id ve tablo CustomerName sütunlarını toplar.
  • ANALYZE; Kullanıcının yetkili olduğu tüm veritabanlarında tablo istatistiklerini toplar.

ANALYZE işlemi indeksleri okumaz veya güncellemez sadece tablo veya sütunlar için çalışır Yalnızca tablo / sütun içeriği ile ilgili olarak sorgunun daha hızlı çalışabilmesi için istatistikleri toplar. Diğer sorgular ANALYZE çalışırken tablodan kayıt okuyabilir ve tablolar bu esnada kilitlenmez.

ANALYZE işleminin tablo içeriği/içerikleri önemli ölçüde değiştiğinde kullanılabilir : Bir tablodaki kayıtların önemli oranda artması, güncellenmesi veya silinmesi durumunda veya tabloya bir indeks eklendikten hemen sonra çalıştırmak faydalıdır Bu bazen sorgu planlayıcısının yeni indeks yapısını doğru kullanması için yardımcı olur.

VACUUM

VACUUM

 

Ölü kayıtların işgal ettiği depoları geri alır. Bir tablodaki ölü kayıtlar silinmiş veya güncellenmiş kayıtların güncellenmeden önceki sürümleridir. Bu tür kayıtlar yalnızca kullanılamıyor olarak işaretlenir, ancak yine de disk taraması yapar ve tablo taramalarını yavaşlatır. VACUUM için ayrıca tablo ANALYZE yapmasını sağlayan bir seçenek vardır .

Birbirinden farklı iki VACUUM versiyonu vardır. VACUUM işlemi temelde, bir tablodaki canlı kayıtları yeniden düzenler ve ayrılan depolama alanını yeni kayıtlar için kullanılabilir duruma getirir. Ancak, bu depolama alanı işletim sistemine dönmez. Bu komut, masadaki diğer okuma ve yazma işlemleriyle paralel olarak çalıştırılabilir. VACUUM FULL ise çalışırken tabloyu kilitler, yeni bir tablo dosyası oluşturur, yalnızca canlı kayıtları bu dosyaya kopyalar, ardından eski tablo dosyasını siler. Bu durumda geri kazanılmış depolama alanı sisteme geri gönderilir. Bu komut vakumlu tablonun üzerinde başka hiçbir okuma ve yazma işlemine izin vermez. Bu yüzden sistemin yoğun olmadığı zamanlarda VACUUM FULL planlanmalıdır.

Örnekler:

  • VACUUM Orders; Orders tablosu içindeki ölü tuplelar (satır) silinerek vakumlarınır.
  • VACUUM VERBOSE Orders; Orders tabloyu vakumlanırken ekrana ilerleme mesajlarını yazdırır.
  • VACUUM FULL Orders; tamamen vakumlar Orders tablosu farklı bir alana yazılır ve eski tablo silinerek yeni Orders tablosu yaratılır. Tam vakum işlemi çalışırken diğer sorgular tabloya erişemez .
  • VACUUM ANALYZE Orders; Orders tablosunu vakumlar ve analiz eder.
  • VACUUM FULL VERBOSE ANALYZE users; Order tablosunu tam boşaltır ve ilerleme adımlarına ait iletileri görüntüler.
  • VACUUM; Geçerli kullanıcının erişebildiği veritabanındaki tüm tabloları vakumlar.

PostgreSQL, de tam vakumlama işlemi yapılacaksa (VACUUM FULL) günün en sakin ve yoğunluğun olmadığı dilimi seçilmelidir. Diğer VACUUM ve ANALYZE işlemleri sistem performansına genelde mani olmaz.

VACUUM komutu bir tablonun içeriği önemli ölçüde değiştikten sonra yoğun ekleme, silme ve güncelleme sonrası kullanılmalıdır. Bulk insert vb. şekilde yeni yaratılmış tablolarda kirli kayıt bulunmayacağından vakum işlemine gerek kalmaz.

Aşağıdaki komut ile ölü satır sayısı canlı satır sayısından fazla olan (kirli kayıt sayısı yüksek ve vakuum gerektirebilecek) tablolar tespit edilebilir.

SELECT n_live_tup, n_dead_tup,* 
FROM pg_stat_user_tables 
WHERE schemaname='ŞemaAdı' and n_dead_tup>n_live_tup and n_dead_tup>0

REINDEX

REINDEX 

Bir tablo veya veritabanının tamamı için mevcut bir dizini (indeksi) veya tüm indeksleri yeniden oluşturur. Bu komut, bir dizin bozulduğunda ve artık kullanılmadığında veya tablo içeriğindeki önemli değişikliklerden sonra bir indeks şişirildiğinde yararlı olur.

Örnekler:

  • REINDEX INDEX idx_orders_on_customer_name; idx_orders_on_customer_name indeksini tablonun güncel hali için yeniden düzenler. 
  • REINDEX TABLE orders; orders tablosundaki tüm dizinleri yeniden düzenler.
  • REINDEX VERBOSE TABLE orders; orders tablosundaki tüm indeksleri yeniden düzenler, boyutlandırır ve ilerleme mesajlarını yazdırır.
  • REINDEX DATABASE "FitERP"; FitERP isimli veritabanındaki tüm tabloların yeniden indeksler.

Kişisel olarak,  hafta sonları yoğunluğun olmadığı saatlerde planlanarak çalıştırılan VACUUM ANALYZE ve daha sonra REINDEX uygulaması veritabanındaki büyük tabloların sorgu performans artışında epey faydalı oluyor.

Yaşayan veritabanlarında kapsamlı bakım çalışmalarının ardından "SELECT pg_stat_reset();" 
ile tablo istatistiklerini sıfırlamalısınız.
Sonrasında (bir kaç gün sonra) güncel istatistik verilerine göre "SELECT * FROM pg_stat_activity;" 
ve "SELECT * FROM pg_stat_user_tables" komutları yardımıyla performansı gözlemleyip 
yeni indeks ve bakım çalışmalarına karar vermeniz gerekecektir.

Son olarak; MSSQL için Update Statistic ve Shrink ile Oracle için Vacuum ve Analyze konularının incelenmesi veritabanları ile ilgileniyorsanız size benzer konularda katkı sağlayabilir.