PostgreSQL INSERT İşlemiyle Diskteki Ham Veri Seviyesi

PostgreSQL INSERT İşlemiyle Diskteki Ham Veri Seviyesi
audio-thumbnail
PostgreSQL INSERT İşlemiyle Diskteki Ham Veri Seviyesi
0:00
/0

PostgreSQL INSERT İşlemiyle Diskteki Ham Veri Seviyesi

PostgreSQL, güçlü bir açık kaynaklı veritabanı sistemidir. Ancak, bir INSERT işlemi nasıl çalışır, veri nerede kaydedilir, ve bu süreçte neler olur? Bu yazıda, PostgreSQL’te bir INSERT işlemi sırasında nasıl bir yolculuk yapılır, ve diske yazılan ham veri seviyesindeki süreç nasıl işler, detaylı bir şekilde açıklanacaktır. Bu bilgiler, PostgreSQL’in iç yapısını anlamak ve performans optimizasyonu için bilinçli kararlar almak adına oldukça değerlidir.

Veri Nasıl Kaydedilir?

PostgreSQL, verileri dosyalar halinde kaydeder. Her tablo ve indeks, bir veya daha fazla dosyada depolanır. Bu dosyalar, genellikle pg_tblspc, pg_wal ve base gibi dizinlerde yer alır. Ancak, bu yazıda odaklanılacak olan, bir INSERT işlemi sırasında diske yazılan verinin ham (brute) seviyesindeki oluşumudur.

Veri Kaydetme Süreci

Bir INSERT işlemi başlatıldığında, PostgreSQL aşağıdaki adımları izler:

  1. Veri Alımı ve Geçici Depolama
    INSERT komutu, istemciden gelir. PostgreSQL bu komutu alır,语法 kontrolü yapar ve geçici bir hafızada (örneğin, shared buffer'da) tutar. Bu hafıza alanı, veri yazılana kadar geçici olarak tutulur.

  2. Shared Buffer'da Kayıt
    Veri, shared buffer'da (hafif bir hafıza alanı) kaydedilir. Shared buffer, tüm bağlantılar tarafından paylaşılır ve veri yazma işlemi tamamlanana kadar orada kalır. Bu, veriyi hafif bir hafızada tutarak hızlı erişim sağlar.

  3. WAL (Write-Ahead Log) Kaydı
    PostgreSQL, tüm değişiklikleri önce bir log dosyasına yazarak güvenliği sağlar. Bu log dosyası pg_wal dizininde yer alır. INSERT işlemi sırasında, veri değişikliği önce WAL kaydına yazılır. Bu, bir sistem çökmüş olsa bile, veri kaybı olmamasını sağlar.

  4. Diskteki Dosyaya Yazma
    WAL kaydı tamamlandıktan sonra, veri gerçek dosyaya yazılır. Bu, base dizinindeki ilgili tablo dosyasına yapılır. Ancak, bu yazma işlemi doğrudan hemen gerçekleşmez. PostgreSQL, veriyi bir süre daha shared buffer'da tutar ve daha sonra bu veriyi diskteki dosyaya yazma işlemi gerçekleştirilir. Bu, genellikle background writer (arka plan yazıcı) tarafından yapılır.

Ham Veri Seviyesinde Neler Olur?

Diskte yazılan veri, tam olarak nasıl bir yapıya sahiptir? Bu soruyu cevaplamak için, verinin ham (brute) seviyesindeki yapısına bir bakış atalım.

Veri Formatı

PostgreSQL, veriyi bir Heap Tuple olarak kaydeder. Bu, bir veri satırını temsil eder. Her Heap Tuple, şu bileşenlerden oluşur:

  • Tuple Header: Bu, verinin başlık bilgilerini içerir. Örneğin, kayıtın boyutu, kaydın durumu (silinmiş mi değil mi), ve diğer meta bilgileri.
  • Data: Gerçek veri alanı. Örneğin, bir id, name, email gibi sütunların değerleri.

Bu yapı, diske yazılırken, binary formatta saklanır. Yani, bir id değeri 4 bayt olarak kaydedilir, bir name değeri ise karakter sayısına göre kaydedilir.

Diskteki Yapı

Veri, bir tablo dosyasına yazılır. Her satır, bir dosya içinde bir page (sayfa) olarak saklanır. PostgreSQL, verileri 8KB'lik sayfalara böler. Her sayfada, bir veya daha fazla tuple bulunur.

Bu sayfalar, bir b-tree yapısı içinde düzenlenir. Ancak, INSERT işlemi sırasında, yeni bir sayfa oluşturulursa, bu sayfa doğrudan diskte oluşturulur. Sayfa içindeki veri, yukarıda açıklanan Heap Tuple yapısına göre düzenlenir.

Performans Optimizasyonu İçin Ne Yapılabilir?

PostgreSQL’te INSERT işlemi sırasında, bazı ayarlamalar ile performans optimize edilebilir. Ancak, bu ayarlamalar, yukarıda açıklanan iç yapıya göre yapılmalıdır.

1. WAL Kaydı ve Checkpoint Ayarları

WAL kaydı, veri güvenliği için çok önemlidir. Ancak, çok sık WAL yazımı, performansı düşürebilir. Bu nedenle, checkpoint_timeout ve wal_sync_delay gibi parametreler, veri güvenliği ile performans arasında dengelenmelidir.

2. Shared Buffer Boyutu

Shared buffer, veri yazma işlemi sırasında önemli bir rol oynar. Eğer bu boyut düşükse, veri diske daha hızlı yazılır. Ancak, bu da performansı düşürebilir. Bu nedenle, shared_buffers parametresi, sistem belleği ve veri hacmi göz önünde alınarak ayarlanmalıdır.

3. Background Writer Ayarları

background writer, shared buffer’daki verileri diske yazan bir süreçtir. Bu süreç, bgwriter_delay ve bgwriter_lru_maxpages gibi parametrelerle kontrol edilir. Bu parametreler, verinin ne kadar sıklıkla diske yazıldığını belirler.

Sonuç

PostgreSQL’te bir INSERT işlemi, çok sayıda adımdan oluşur. Veri, önce hafızada tutulur, sonra WAL kaydı yapılır, ve sonunda diskteki dosyaya yazılır. Bu süreçte, veri ham seviyesinde bir Heap Tuple olarak kaydedilir ve 8KB’lik sayfalara bölünerek saklanır. Bu iç yapıyı anlamak, performans optimizasyonu için kritik öneme sahiptir. Doğru ayarlarla, PostgreSQL, hem hızlı hem de güvenli bir veritabanı sistemine dönüşebilir.