pg内存介绍

  1. shared_buffers
    核心用途:
    数据库缓冲区缓存:存储表和索引的数据页

共享内存区域:所有PostgreSQL进程共享的内存

减少磁盘I/O:类似于Oracle的Buffer Cache

特性 PostgreSQL shared_buffers Oracle Buffer Cache
位置 进程共享内存 SGA的一部分
管理方式 时钟扫描算法(Clock-sweep) LRU算法
OS缓存角色 双层缓存:也依赖OS缓存 主要依赖自身缓存
默认值 128MB 自动管理
  1. work_mem
    核心用途:
    每个操作的私有内存:用于排序、哈希、位图操作
    会话级私有内存:每个操作独立分配
    可并行使用:多个操作可同时使用各自的work_mem

  2. maintenance_work_mem
    核心用途:
    维护操作专用内存:VACUUM、CREATE INDEX、ALTER TABLE等
    一次性大内存分配:这些操作需要连续内存块
    提升维护性能:减少维护操作的I/O

综合内存监控
WITH memory_settings AS (
SELECT
name,
setting,
unit,
CASE
WHEN name = 'shared_buffers' THEN 'Shared Buffer Cache'
WHEN name = 'work_mem' THEN 'Per-operation Memory'
WHEN name = 'maintenance_work_mem' THEN 'Maintenance Memory'
ELSE name
END as description
FROM pg_settings
WHERE name IN ('shared_buffers', 'work_mem', 'maintenance_work_mem')
)
SELECT
description,
setting || ' ' || unit as current_value,
CASE
WHEN name = 'shared_buffers' AND setting::bigint < 10241024128
THEN 'Warning: May be too small for production'
WHEN name = 'work_mem' AND setting::bigint < 4096*1024
THEN 'Warning: May cause disk sorting'
ELSE 'OK'
END as recommendation
FROM memory_settings;

LRU理论上最优的近似算法,命中率最高。 时钟扫描(Clock-Sweep)略低于LRU,但远优于FIFO,且开销小,实际系统常用。

posted @ 2026-01-30 15:00  ocmji  阅读(1)  评论(0)    收藏  举报