1.介绍
PostgreSQL 在 9.1 中推出了一种特殊的表:unlogged table。使用 unlogged table 最大的特点是涉及到表的更新,删除等操作不会记录 WAL 日志,这样可以大大的提高性能,类似于MySQL的临时表特性。不过需要特别注意的是,极端情况下数据库异常宕机时,unlogged tables 中的数据可能会丢失。
特性:
- 对 unlogged table 的操作是不记录 WAL 日志的,因此写入速度相较于普通表要快。
- 如果有hot standby,备库中只有表结构而没有数据。
- 当数据库 crash 后,如运行 kill -9 数据库重启时自动清空unlogged table的数据。
- 如果正常关闭数据库,如再启动时,unlogged table 中是有数据的
2.使用场景:
可以接受数据丢失的风险,数据可以从其他源进行导入。 unlogged表通常用于中间结果,频繁变更的会话数据。
✅ 适合使用
- 会话缓存数据:存储可丢失的临时数据,如Web会话、实时计算结果
- ETL 临时表;
- 实时统计数据(可重建);
- 日志数据(可丢失);
- 测试和开发环境;
- 数据仓库中间表;
- 大批量数据导入:先将目标表设为UNLOGGED,导入完成后转回LOGGED,可显著提升速度
❌ 不适合使用
- 核心业务数据;
- 需要持久化的关键记录;
- 主从复制环境(备库需要数据);
- 金融交易数据;
- 审计日志;
- 任何不能丢失的数据;
3.Unlogged操作实例
实例:
#表结构创建:
CREATE UNLOGGED TABLE unlogged_table (
id INT PRIMARY KEY,
created_date DATE DEFAULT CURRENT_DATE,
created_time TIME DEFAULT CURRENT_TIME,
created_at TIMESTAMP DEFAULT NOW()
);
#插入数据:
INSERT INTO unlogged_table values(1);
INSERT INTO unlogged_table values(2);
INSERT INTO unlogged_table values(3);
INSERT INTO unlogged_table values(4);
INSERT INTO unlogged_table values(5);
查询系统表信息:
#查找UNLOGGED的表:
SELECT n.nspname AS schema_name, c.relname AS table_name
FROM pg_class c JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind = 'r' AND c.relpersistence = 'u';
pg_class的 relpersistence字段:
p:表示 permanent(永久) 表,即普通表,数据持久化存储,不受会话影响。
u:表示 unlogged(未记录)表,不写 WAL 日志,性能更高,但实例崩溃后数据可能丢失。
t: 表示 temporary(临时) 表,仅对当前会话可见,会话结束自动删除。
查询表结构信息:
#查看表信息:
db1=# \d+ unlogged_table;
Unlogged table "public.unlogged_table"
Column | Type | Collation | Nullable | Default | Storage | Compression | Stats target | Description
--------------+-----------------------------+-----------+----------+--------------+---------+-------------+--------------+-------------
id | integer | | not null | | plain | | |
created_date | date | | | CURRENT_DATE | plain | | |
created_time | time without time zone | | | CURRENT_TIME | plain | | |
created_at | timestamp without time zone | | | now() | plain | | |
Indexes:
"unlogged_table_pkey" PRIMARY KEY, btree (id)
Access method: heap
变更表属性:
#变更表属性:
ALTER TABLE unlogged_table SET LOGGED;
ALTER TABLE unlogged_table SET UNLOGGED;
4. 性能实测数据
以下是在禁用autovacuum的测试环境下,普通表与UNLOGGED表的性能对比:
| column1 | column2 | column3 |
|---|
| 操作 | 普通表 | UNLOGGED表 | 性能提升 |
|---|---|---|---|
| 更新100万行 | 5.592秒 | 3.173秒 | 快约1.8倍 |
| 生成WAL日志量 | 320MB | 16MB | 减少约95% |
| TPC-B基准TPS | 168 | 485 | 快约2.9倍 |
5.总结
UNLOGGED 表是 PostgreSQL 提供的性能优化工具,但它是一把双刃剑,以牺牲持久性和复制能力为代价换取极高的写入性能(提升 50-70%)。适合临时性、可丢失、非关键的数据场景。
在实际应用中,建议:
- 明确数据丢失风险;
- 仅在性能瓶颈处使用;
- 配合定期刷盘策略;
- 避免在主从架构中使用;
- 做好监控和告警;
| NO | 特性 | UNLOGGED 表 | 普通表 |
|---|---|---|---|
| 1 | WAL 记录 | ❌ 不记录 | ✅ 记录 |
| 2 | 崩溃恢复 | ❌ 数据丢失(清空) | ✅ 完整恢复 |
| 3 | 复制支持 | ❌ 不复制 | ✅ 复制 |
| 4 | 写入性能 | ⚡ 极快 | 正常 |
| 5 | 事务持久性 | ❌ 不持久 | ✅ 持久 |
如需进一步优化性能且能接受风险,可考虑 UNLOGGED 表;否则,优先使用普通 LOGGED 表以保障数据安全。unlogged表不是不安全,而是用途特定。理解它的机制和边界,就能在性能和可靠性之间做出合理选择。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




