# Четыре состояния буфера _Буферный кеш и WAL · PostgreSQL Knowledge Base_ **TL;DR:** Любое обращение к данным сводится к одному из четырёх исходов: hit (страница в кеше), read (промах, чтение с диска), dirtied (изменён в памяти), written (сброшен на диск). Соотношение hit к read показывает эффективность кеша; в PG16 их детально считает pg_stat_io. ## Четыре исхода - **hit** - нужная страница уже в кеше, диск не трогается. Самый дешёвый; - **read** - страницы в кеше нет, её читают с диска в свободный буфер (промах); - **dirtied** - буфер изменили в памяти, теперь он «грязный» и отличается от диска; - **written** - грязный буфер сбросили на диск (bgwriter, checkpointer или сам бэкенд). Чем выше доля hit к read, тем меньше обращений к диску. Объём записей показывает нагрузку на запись. ## Где смотреть Простой срез по таблице: ```sql SELECT heap_blks_hit, heap_blks_read FROM pg_statio_user_tables WHERE relname = 'flights'; ``` Подробно, с PostgreSQL 16, - `pg_stat_io`: разбивка по типу backend'а, объекту и виду операции (чтения, записи, попадания, вытеснения, расширения файла): ```sql SELECT backend_type, object, context, reads, writes, hits FROM pg_stat_io WHERE reads > 0 OR writes > 0; ``` ## Как читать - много `read` после прогрева - данные не помещаются в кеш или его вымывает большой скан (см. [buffer-ring](/courses/postgres/kb/buffer-ring.md)); - много `written` бэкендами (в `pg_stat_io` контекст `normal`, backend не bgwriter/checkpointer) - bgwriter не поспевает или `shared_buffers` мал; - высокий hit-ratio при нагрузке - кеш работает, узкое место в другом. Состояния - это поведение [buffer-cache](/courses/postgres/kb/buffer-cache.md) в цифрах. По ним судят, помог ли кеш конкретному запросу. ## Команды ```sql SELECT heap_blks_hit, heap_blks_read FROM pg_statio_user_tables WHERE relname='flights'; ``` Попадания и чтения с диска по таблице ```sql SELECT * FROM pg_stat_io WHERE reads > 0; ``` Детальная статистика ввода-вывода (PG16): hit/read/write/evict ## См. также - [Буферный кеш и вытеснение](/courses/postgres/kb/buffer-cache.md) - [Буферное кольцо для seq scan](/courses/postgres/kb/buffer-ring.md) - [Контрольные точки и восстановление](/courses/postgres/kb/checkpoint.md)