实测 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 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 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 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 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 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 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 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 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 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 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 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 退出码。