PostgreSQL Performans Optimizasyonu ve Sıkıştırma Yöntemleri: pglz vs. LZ4
PostgreSQL, büyük veri setlerini yönetmede ve depolamada esnek çözümler sunar. Ancak, verinin depolanması sırasında kullanılacak sıkıştırma algoritması, sadece disk alanından tasarruf sağlamakla kalmaz, aynı zamanda sorgu performansını da doğrudan etkiler. Geleneksel olarak PostgreSQL’in TOAST (The Oversized-Attribute Storage Technique) mekanizmasında pglz algoritması kullanılırken, PostgreSQL 14 sürümüyle birlikte LZ4 desteği de eklenmiştir. Bu yazıda, bu iki sıkıştırma yöntemi arasındaki farklar, avantajlar ve LZ4’ın nasıl yapılandırılacağı ele alınacaktır.
TOAST ve pglz Sıkıştırması
PostgreSQL’de büyük boyutlu veriler, TOAST adı verilen mekanizma aracılığıyla saklanır. Varsayılan olarak, TOAST verileri sıkıştırmak için pglz algoritmasını kullanır.
- pglz algoritması, Lempel-Ziv ailesinden bir varyanttır ve sıkıştırma oranı ile hız arasında makul bir denge sağlamayı hedefler.
- Ancak, bazı kullanım durumlarında bu algoritmanın performansı yetersiz kalabilir; özellikle de sıkıştırılmış veriye sık erişim sağlanıyorsa, açma işlemleri işlem süresini uzatabilir.
LZ4 Sıkıştırması ve Avantajları
PostgreSQL 14 ile LZ4 algoritması desteklenmeye başlanmıştır. LZ4’ün sunduğu başlıca avantajlar şunlardır:
- Daha Yüksek Performans: LZ4, verileri çok daha hızlı sıkıştırıp açabilme yeteneğine sahiptir. Yoğun okuma/yazma işlemlerinde sorgu sürelerinde ciddi biçimde iyileşme sağlar.
- Düşük CPU Kullanımı: LZ4, CPU kaynaklarını daha az tüketir. Bu sayede işlemler sırasında sistem kaynakları üzerindeki yük azalır.
- Gelişmiş Sıkıştırma Metodolojisi: Özellikle metin (text) ya da JSON gibi veri tiplerinde, LZ4 algoritması satırlar arası toplanan verileri; diziler halinde sıkıştırarak, TOAST tablolarında disk alanı kullanımını minimize eder.
Özellikle TimescaleDB gibi zaman serisi verisinin yoğun olarak işlendiği durumlarda, LZ4’ın sağladığı performans artışı neredeyse hemen fark edilir. Bu, veritabanı sorgularında sıkıştırılmış metin veya JSON kolonlarının dekompresyon süresini kısaltarak; sorgu sürelerinde belirgin bir iyileşme sağlar.
LZ4 Nasıl Ayarlanır?
LZ4’ü kullanabilmek için PostgreSQL örneğinizin LZ4 desteğine sahip olması gerekmektedir. Resmi PostgreSQL binary’leri veya Docker imajlarını kullanıyorsanız, bu desteğe zaten sahipsiniz demektir. Kendi kaynak kodunuzdan derleme yapıyorsanız, configure aşamasında –with-lz4 bayrağını eklediğinizden emin olun.
Oturum Bazında Ayarlama
Psql’ye bağlandıktan sonra, mevcut oturumda LZ4 sıkıştırmasını aktifleştirmek için aşağıdaki komutu kullanabilirsiniz:
SET default_toast_compression = lz4;
Global Ayarlama
Tüm bağlantılar için LZ4’ü varsayılan yapmak isterseniz, PostgreSQL ana yapılandırma dosyanız olan postgresql.conf içerisine aşağıdaki satırı ekleyebilirsiniz:
default_toast_compression = 'lz4'
Not: Varsayılan TOAST sıkıştırma metodunu değiştirdiğinizde, önceden sıkıştırılmış veriler yeni algoritmaya göre yeniden sıkıştırılmaz. Sadece gelecekte eklenen verilerde LZ4 kullanılacaktır.
Belirli Bir Kolon İçin Ayarlama
Tablo oluştururken spesifik bir sütun için sıkıştırma algoritmasını belirlemek istiyorsanız, COMPRESSION seçeneğini kullanabilirsiniz:
CREATE TABLE lz4_ornek (
id int,
lz4_kolon text COMPRESSION lz4
);
Bu yapılandırma, farklı kolonlarda farklı sıkıştırma algoritmalarını kullanabileceğiniz esnekliği sağlar.
Benchmark Sonuçları: pglz vs. LZ4
Aşağıda, makaleye 1 milyon kayıt içeren bir test ortamında pglz ve LZ4 algoritmalarının performansını karşılaştıran örnek bir tablo ve grafik yer almaktadır. Veriler, Timescale’ın blog yazısındaki benchmark sonuçlarından esinlenerek varsayımsal değerlerle oluşturulmuştur.

Benchmark Sonuçları Tablosu
Test Durumu | pglz Süresi (saniye) | LZ4 Süresi (saniye) | Performans İyileşmesi |
Sorgu 1 (Min, Max, Count hesaplama) | 1.70 | 0.98 | Yaklaşık %73 hızlanma |
Genel Test Seti | 1.50 | 1.30 | Yaklaşık %13 hız artışı |
En Yoğun Veri Sorguları | 2.50 | 1.80 | Yaklaşık %37.3 hız artışı |
Clickbench Benchmark (LIKE sorguları) | 2.00 | 1.70 | Yaklaşık %24.2 hız artışı |
Timescale ekibi, pglz ile LZ4 algoritmalarını karşılaştırmak için, yaklaşık 20 yıllık e-posta arşivi içeren ve yaklaşık bir milyon satırdan oluşan “hackers” adlı bir tablo üzerinde testler gerçekleştirmiştir.
Tablonun öne çıkan detayları:
- Kolonlar: id (int), sent (timestamp), subject (text), author (text) ve body_plain (text)
- Özellik: body_plain kolonu oldukça geniş olup, ortalama yaklaşık 1.354 karakter uzunluğundadır.
Test senaryosu:
- Sorgular, belirli metin ifadelerini içeren satırların minimum, maksimum zaman değerlerini ve toplam satır sayılarını hesaplamaktadır.
- Örnek sorgulardan biri şu şekildedir:
SELECT min(sent), max(sent), count(*)
FROM hackers
WHERE body_plain LIKE '%vacuum%'
GROUP BY author;
Benchmark sonuçları:
- Sorgu 1: pglz ile 1.7 saniye süren bir sorgu, LZ4 ile çalıştırıldığında 0.98 saniyeye düşerek %72 oranında hızlanma sağlamıştır.
- Test seti genelinde, LZ4 kullanıldığında ortalama %13 performans iyileştirmesi gözlemlenmiştir.
- En yoğun veri içeren sorgular, %37.32 daha hızlı tamamlanmıştır.
- Ek bir “clickbench” benchmark’ında, LIKE operatörü kullanan dört farklı sorguda ortalama %24.20 performans artışı tespit edilmiştir.
Bu sonuçlar, LZ4’ün özellikle geniş metin verilerinin sıkıştırılması ve dekompresyonunda ciddi performans avantajları sunduğunu göstermektedir.
Sonuç
PostgreSQL’de kullanılan TOAST mekanizmasında varsayılan olarak yer alan pglz algoritması, belirli kullanım durumları için yeterli bir çözüm sunarken, PostgreSQL 14 ile birlikte desteklenen LZ4 algoritması, veritabanı performansında ve CPU kullanımında önemli iyileştirmeler sağlamaktadır.
- LZ4’ün avantajları: Hızlı sıkıştırma/dekompresyon, düşük CPU tüketimi ve verimli disk alanı kullanımıdır.
- Özellikle: Metin veya JSON gibi büyük veri tiplerinin bulunduğu uygulamalarda LZ4’ün etkinleştirilmesi, sorgu performansında çarpıcı iyileştirmeler getirmektedir.
TimescaleDB kullanıcıları için de ek bir avantaj, yeni gelen verilerin otomatik olarak LZ4 ile sıkıştırılabilmesidir. Eğer yoğun metin veya JSON içeriği ile çalışan bir PostgreSQL/TimescaleDB ortamınız varsa, LZ4’ün varsayılan sıkıştırma yöntemi olarak yapılandırılması, genel veritabanı performansınızı artıracaktır.