暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PostgreSQL unlogged表 特性解析

原创 Cui Hulong 1天前
29

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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论