PostgreSQL INSERT İşlemiyle Diskteki Ham Veri Seviyesi
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:
-
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. -
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. -
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_waldizininde 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. -
Diskteki Dosyaya Yazma
WAL kaydı tamamlandıktan sonra, veri gerçek dosyaya yazılır. Bu,basedizinindeki 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, genelliklebackground 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,emailgibi 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.