UNLOGGED表适用于可重算、不需持久化和复制的临时场景,如ETL中间表、日志缓冲区、测试数据生成;崩溃后数据清空,不参与WAL、主从复制及标准备份。

UNLOGGED 表能显著加快 INSERT,但只适合可丢弃的临时数据——它不写 WAL,崩溃即清空,主从复制也不同步。
什么时候该用 UNLOGGED 表
适用于 ETL 中间表、日志缓冲区、测试数据生成、维度表批量重建等场景。只要满足:数据可重算、不参与主从复制、不需要崩溃恢复保障。
- 不能用于用户订单、账户余额、审计日志等关键业务表
- 如果表已有索引或外键,先
DROP INDEX和ALTER TABLE DROP CONSTRAINT,否则CREATE UNLOGGED TABLE AS SELECT会失败 - UNLOGGED 表上的索引也自动是 unlogged 的,重启后全失效
创建与转换的实操要点
PostgreSQL 9.5+ 支持运行时切换,但必须在空表或刚建完未插入时操作;已有数据的表不能直接 ALTER TABLE ... SET UNLOGGED(会报错)。
PostgreSQL 18.4 官方 Ubuntu 安装包现已发布,这是目前最新的稳定版本。推荐通过官方 APT 仓库安装:先执行 sudo apt update 更新索引,再运行 sudo apt install postgresql-18 即可完成部署。新版本引入了异步 I/O 子系统,在顺序扫描与 VACUUM 场景下性能提升显著,同时支持 UUID v7 原生生成函数与虚拟生成列。
- 新建时就声明:
CREATE UNLOGGED TABLE tmp_data (id SERIAL, name TEXT); - 从现有表快速克隆(含结构+数据):
CREATE UNLOGGED TABLE tmp_data AS SELECT * FROM source_table; - 加载完数据后转回普通表:
ALTER TABLE tmp_data SET LOGGED;(注意:此操作会触发一次全表 WAL 写入,耗时随数据量增长) - 若需保留原表名并替换,建议用
RENAME+DROP组合,避免锁表时间过长
容易被忽略的副作用
UNLOGGED 表不是“快一点的普通表”,它的行为差异会穿透整个运维链路。
- 备份工具(如 pg_basebackup、pg_dump --inserts)默认不包含 UNLOGGED 表内容,除非显式加
--include-unlogged-table-data - 逻辑复制(logical replication)完全忽略 UNLOGGED 表,即使你把它加进 publication 也没用
-
VACUUM仍可运行,但ANALYZE必须执行,否则查询计划器可能误判行数导致慢查询 - 使用
\dt+查看表时,relpersistence字段为u才是 UNLOGGED;用 SQL 查:SELECT relname, relpersistence FROM pg_class WHERE relkind = 'r' AND relpersistence = 'u';
真正卡住人的地方往往不是怎么建,而是忘记它不参与 WAL 流程——比如某次意外 kill -9 后发现中间表全空,或者上线后发现从库少了某张“临时”维度表,结果报表对不上。把 UNLOGGED 当成一次性沙盒,而不是加速开关,才不容易翻车。










