Bir Postgres veritabanında SELECT sorgusu çalıştırıldığında ve diskten veri okunması gerektiğinde, bu işlemin arkasında üç farklı önbellek katmanı bulunur. Bu katmanlar, veriye erişim maliyetini ve hızını doğrudan etkiler. İlk katman, Postgres'in kendi belleğinde yer alan ve varsayılan olarak 4GB boyutunda ayarlı olan shared buffers'tır. Postgres bir sayfaya (8KB) ihtiyaç duyduğunda ilk olarak burayı kontrol eder. Eğer veri burada bulunursa, herhangi bir sistem çağrısı veya çekirdek (kernel) müdahalesi olmadan doğrudan bellekten okunur, bu da en hızlı erişim yoludur.
Eğer istenen sayfa shared buffers'ta yoksa, Postgres read(2) sistem çağrısını yaparak çekirdeğe başvurur. Bu noktada devreye giren ikinci katman, işletim sisteminin kendi disk blokları önbelleği olan OS page cache'tir. Çekirdek, istenen bloğun bellekte önceden önbelleğe alınıp alınmadığını kontrol eder. Eğer veri OS page cache'te bulunursa, çekirdek onu anında döndürür. Bu durumda fiziksel disk I/O'su gerçekleşmez; Postgres açısından bir "shared buffer miss" olsa da, işletim sistemi açısından hala bir bellek okumasıdır. Önemli bir nokta, shared buffers ile OS page cache'in aynı fiziksel RAM için rekabet etmesidir. shared buffers'ı aşırı artırmak, OS page cache'i aç bırakarak genel performansı olumsuz etkileyebilir.
Son ve en maliyetli katman ise disktir. Eğer istenen sayfa ne shared buffers'ta ne de OS page cache'te bulunamazsa, çekirdek bir I/O isteğini cihaz sürücüsüne gönderir. Örneğin, Heroku durumunda bu cihaz AWS EBS gibi ağa bağlı bir blok depolama birimidir. Bu yol, en yavaş ve en maliyetli olanıdır ve her bir disk okuması bir IOPS olarak sayılır. Bu katmanların anlaşılması, veritabanı performans sorunlarını gidermek ve optimize etmek için kritik öneme sahiptir.
Postgres performansını optimize etmek ve IOPS maliyetlerini düşürmek için veritabanı ile disk arasındaki üç farklı önbellek katmanının nasıl çalıştığını anlamak kritik öneme sahiptir.