知其然,知其所以然
PostgreSQL 实测 2026-10-30

PostgreSQL EXPLAIN ANALYZE 估计行数和实际行数差很多怎么办:过期统计信息、列相关、数据倾斜和 pg_stat_statements

实测 PostgreSQL 16.15 怎么读 EXPLAIN ANALYZE:估计行数与实际行数对比;统计信息过期时估计 1 行、实际 900000 行,Nested Loop 767.68 ms,ANALYZE 后 109.37 ms;两列相关用 CREATE STATISTICS 把估计从 1030 修正到 10200;statistics target 对倾斜数据的影响;pg_stat_statements 找出平均 42.230 ms 的无索引查询。

PostgreSQL EXPLAIN ANALYZE 统计信息 ANALYZE CREATE STATISTICS pg_stat_statements 行数估计 慢查询 真实验证 动画演示
PostgreSQL 实测 2026-10-30

PostgreSQL Nested Loop、Hash Join、Merge Join 什么时候用哪个:work_mem 分批、外键没索引和 NOT IN 为什么慢

实测 PostgreSQL 16.15 三种 JOIN 算法:小外表+索引用 Nested Loop(0.04 ms)、大批量用 Hash Join(144.82 ms 对 Nested Loop 550.43 ms);work_mem 4MB 时 Hash Join 分 8 批;Merge Join 在 ORDER BY 加 limit 时 47.30 ms 对 357.60 ms;外键列没索引从 0.23 ms 变 64.97 ms;NOT IN 放不进哈希时 10 秒超时,有 NULL 时一行都查不到。

PostgreSQL JOIN Nested Loop Hash Join Merge Join work_mem NOT IN NOT EXISTS 执行计划 真实验证 动画演示
PostgreSQL 实测 2026-10-30

Sort Method: external merge Disk 是什么意思:PostgreSQL work_mem 与排序、top-N heapsort、临时文件日志实测

实测 PostgreSQL 16.15 work_mem 与排序:100 万行 work_mem 4MB 时 Sort Method: external merge Disk: 17672kB,64MB 时 quicksort Memory: 55827kB;order by limit 10 用 top-N heapsort 只占 27kB;有索引时没有 Sort 节点 28.64 ms 对 258.66 ms;log_temp_files 的日志和 pg_stat_database;HashAggregate 4MB 时分 9 批写 23536kB。

PostgreSQL work_mem external merge Sort Method top-N heapsort 临时文件 log_temp_files HashAggregate 真实验证 动画演示
PostgreSQL 实测 2026-10-30

PostgreSQL shared_buffers 该设多大:pg_buffercache 看缓存、全表扫描的环形缓冲、命中率和 pg_prewarm 实测

实测 PostgreSQL 16.15 shared_buffers 与缓存命中:重启后第一次 read=3623、第二次全部 hit;全表扫描只占 33 个缓冲区不会灌满缓存;2 万次随机点查索引页命中率 95.4%、堆页 44.3%;shared_buffers 16MB/64MB/256MB 的 read 数 31857/13502/0;pg_prewarm 把 2745 + 15424 个页预热回缓冲区。

PostgreSQL shared_buffers pg_buffercache pg_prewarm 缓存命中率 pg_statio_user_tables 环形缓冲 真实验证 动画演示
PostgreSQL 实测 2026-10-30

PostgreSQL 一次 UPDATE 写了多少 WAL:pg_waldump 读记录、整页镜像、full_page_writes 和 unlogged 表实测

实测 PostgreSQL 16.15 的 WAL:检查点后第一次修改一页,UPDATE 写 18256 字节,同一页的下一行只有 176 字节(整页镜像);pg_waldump 读出 Heap LOCK、UPDATE、Btree INSERT_LEAF、COMMIT 四条记录;更新 1000 行 480280 字节对 309056 字节;full_page_writes off 省下 494128 → 299400;unlogged 和临时表 0 WAL。

PostgreSQL WAL pg_waldump pg_walinspect full page image full_page_writes unlogged table 检查点 真实验证 动画演示
PostgreSQL 实测 2026-10-30

PostgreSQL synchronous_commit 和 fsync 对吞吐的影响:pgbench 实测,fsync_writethrough 只有 276 tps,批量提交 37595 行/秒对逐行提交 9168 行/秒

实测 PostgreSQL 16.15 的提交与刷盘:macOS 上默认 open_datasync 约 2 万次/秒,fsync_writethrough 只有 342.777 次/秒;pgbench 同步提交 1 个连接 3778 tps、16 个连接 12609 tps(组提交);synchronous_commit = off 5526 tps;fsync_writethrough 276 tps;批量提交 37595 行/秒对逐行提交 9168 行/秒。

PostgreSQL synchronous_commit fsync wal_sync_method fsync_writethrough pgbench 组提交 批量提交 真实验证 动画演示
PostgreSQL 实测 2026-10-30

LOG: checkpoints are occurring too frequently 怎么办:max_wal_size、log_checkpoints 日志和 checkpoint_completion_target 实测

实测 PostgreSQL 16.15 日志警告 checkpoints are occurring too frequently:max_wal_size 64MB 时 10 秒 22 次 WAL 触发的检查点;log_checkpoints 日志怎么读;max_wal_size 调到 1GB 后 requested 为 0;checkpoint_completion_target 0.9 与 0.1 的 write 阶段 26.1 s 对 2.6 s;手动 CHECKPOINT 耗时随脏页数增长。

PostgreSQL checkpoints are occurring too frequently max_wal_size log_checkpoints checkpoint_completion_target 检查点 真实验证 动画演示
PostgreSQL 实测 2026-10-30

database system was not properly shut down; automatic recovery in progress:PostgreSQL 崩溃恢复要多久,unlogged 表会怎样

实测 PostgreSQL 16.15 崩溃恢复:kill -9 一个后端会断开所有连接并自动恢复(0.06 s);kill -9 postmaster 后启动日志 not properly shut down; automatic recovery in progress;崩溃前 8 MB / 61 MB / 230 MB WAL 对应启动 0.13 s / 0.26 s / 0.56 s;unlogged 表恢复后被清空;正常关闭不需要 redo。

PostgreSQL 崩溃恢复 redo not properly shut down kill -9 pg_controldata unlogged table postmaster.pid 真实验证 动画演示
PostgreSQL 实测 2026-10-30

PostgreSQL 为什么需要连接池:新建连接 1.82 ms 对复用 0.051 ms,max_connections 与吞吐、idle in transaction 实测

实测 PostgreSQL 16.15 的连接成本:新建连接 1.82 ms 对复用 0.051 ms;pgbench -S 持久连接 82406 tps 对每个事务重连 1393 tps;10 核机器上 64 个连接吞吐到顶 107795 tps,256 个连接延迟 2.564 ms;max_connections 100 到 5000 共享内存 279MB 到 513MB;idle in transaction 与 idle_in_transaction_session_timeout。

PostgreSQL 连接 max_connections 连接池 pgbench -C idle in transaction shared_memory_size 连接成本 真实验证 动画演示
PostgreSQL 实测 2026-10-30

FATAL: requested WAL segment has already been removed:PostgreSQL 流复制、同步复制卡住和复制槽实测

实测 PostgreSQL 16.15 流复制:pg_basebackup -R 搭备库;单行提交的备库可见延迟 0.15 ms;同步复制备库停掉后提交卡在 SyncRep,cancel 后 WARNING canceling wait for synchronous replication;备库停机 264 MB WAL 后报 requested WAL segment has already been removed;复制槽保留 198 MB WAL 让备库追平。

PostgreSQL 流复制 pg_basebackup requested WAL segment has already been removed 复制槽 同步复制 SyncRep replication lag 真实验证 动画演示
PostgreSQL 实测 2026-10-30

PostgreSQL 逻辑复制报 duplicate key 卡住了怎么办:replica identity、DDL 不复制和 ALTER SUBSCRIPTION SKIP 实测

实测 PostgreSQL 16.15 逻辑复制:建订阅 0.12 s 拷贝 1000 行;订阅端冲突报 duplicate key 并不停重试,alter subscription skip (lsn) 跳过;无主键表 UPDATE 报 cannot update table because it does not have a replica identity;DDL 不复制报 missing replicated column;序列不复制;订阅端停机槽保留 65 MB WAL,drop subscription 后要手动删槽。

PostgreSQL 逻辑复制 publication subscription duplicate key replica identity ALTER SUBSCRIPTION SKIP 复制槽 真实验证 动画演示
PostgreSQL 实测 2026-10-30

FATAL: no pg_hba.conf entry 和 password authentication failed 怎么排查:PostgreSQL 连接报错与 pg_hba_file_rules 实测

实测 PostgreSQL 16.15 连接报错:no pg_hba.conf entry for host "127.0.0.1", user, database, no encryption 怎么看;password authentication failed 的真正原因只在服务器日志 DETAIL(Connection matched file … line 2 / has no password assigned);reject 与 trust 的顺序;pg_hba_file_rules 的 error 列提前查语法;Connection refused 与 No such file or directory;pg_isready 退出码。

PostgreSQL pg_hba.conf no pg_hba.conf entry password authentication failed scram-sha-256 pg_hba_file_rules Connection refused pg_isready 真实验证 动画演示
京ICP备2026067502号-1京公网安备11010502063487号