unlogged 表
如何创建
创建 unlogged 表需要在 create table 时显示的使用 UNLOGGED 指定;
特点
1. unlogged table 不会写 WAL 日志,也不会同步到 standby,所以速度比普通表快非常多,以下是在虚拟机中使用 ltbench 测试的结果,可以看出,unlogged 表的性能是普通表的 2 倍:
$ ltbench -s 100 -i -p 12345 postgres
$ ltbench -c 8 -j 1 -T 30 -P 1 -p 12345 postgres
starting vacuum...end.
progress: 1.0 s, 1035.9 tps, lat 7.499 ms stddev 2.105
progress: 2.0 s, 1071.0 tps, lat 7.452 ms stddev 2.805
progress: 3.0 s, 1179.1 tps, lat 6.771 ms stddev 1.472
progress: 4.0 s, 1216.9 tps, lat 6.558 ms stddev 1.495
progress: 5.0 s, 1003.8 tps, lat 7.960 ms stddev 3.295
progress: 6.0 s, 1083.0 tps, lat 7.366 ms stddev 1.976
progress: 7.0 s, 1108.3 tps, lat 7.190 ms stddev 2.020
progress: 8.0 s, 1169.9 tps, lat 6.824 ms stddev 1.632
progress: 9.0 s, 993.0 tps, lat 8.048 ms stddev 7.508
$ ltbench -s 100 -i -p 12345 --unlogged-tables postgres
$ ltbench -c 8 -j 1 -T 30 -P 1 -p 12345 postgres
starting vacuum...end.
progress: 1.0 s, 1951.9 tps, lat 3.988 ms stddev 1.406
progress: 2.0 s, 1908.0 tps, lat 4.185 ms stddev 1.724
progress: 3.0 s, 1972.5 tps, lat 4.050 ms stddev 1.335
progress: 4.0 s, 2031.4 tps, lat 3.924 ms stddev 1.277
progress: 5.0 s, 2040.0 tps, lat 3.917 ms stddev 1.376
progress: 6.0 s, 1981.1 tps, lat 4.026 ms stddev 1.450
progress: 7.0 s, 1986.0 tps, lat 4.016 ms stddev 1.343
progress: 8.0 s, 1780.2 tps, lat 4.484 ms stddev 1.653
progress: 9.0 s, 1434.6 tps, lat 5.562 ms stddev 1.802
2. 此外在 session 结束或数据库正常关闭时,unlogged 表的定义和数据都会被保留,但如果发生 crash 或 unclean shutdown,则其中的数据会被清除;
temp 表
如何创建
创建 temp 表需要在 create table 时显示的使用 TEMPORARY 或 TEMP 指定,并且支持设置 on commit:
- PRESERVE ROWS:行为是事务结束时保留所有数据(默认行为);
- DELETE ROWS:行为是事务结束时删除 (truncate) 所有数据;
- DROP:行为是事务结束时删除表;
SQL 标准区分了 GLOBAL 临时表和 LOCAL 临时表。出于 SQL 标准兼容性考虑,LightDB 在临时表声明中接受 GLOBAL 和 LOCAL 关键字,但它们目前没有任何效果。所以不建议使用这些关键字;
特点
1. 会话隔离性:
创建临时表后,不但不同会话间的数据是相互隔离的,就连临时表的定义也是不同会话间相互隔离的,也就是一个会话创建的临时表,不能被其他会话看到,如下图所示:
session1:创建了临时表 tmp
session2:以另一个会话登录相同用户名和数据库,查看 session1 中创建的临时表,既不能查询表,也不能查看表结构,但可以通过系统视图看到该临时表的存在
2. 易挥发性:
LightDB 中的临时表的生命周期最长就是会话生命周期,甚至更短,如图所示:
上图是前面session1退出会话后,再次登录查询之前创建的临时表tmp,已经查不到了,哪怕是临时表定义也没了。
此外,在创建PostgreSQL 临时表时,还可以设置相关选项,使得临时表在事务结束时消失,哪怕会话没结束,也会消失,如图所示:
3. 数据的易挥发性:
通过 on commit drop 选项可以设置事务结束临时表就消失外,还可以通过on commit相关选项,分别控制临时表的数据在事务结束消失(仅仅数据消失,定义还存在)和会话结束消失(数据和表定义都消失),如下通过on commit delete rows定义了临时表:
默认为ON COMMIT PRESERVE ROWS,事务结束时,数据依然还会存在,直到会话结束为止。
比较
unlogged table | temp table | |
定义持久化 | 可持久化 | 无法持久化 |
数据持久化 | 可持久化,但异常时会被清空 | 无法持久化 |
是否写 wal 日志 | 否 | 否 |
是否 standby | 否 | 否 |
会话隔离 | 不隔离 | 隔离 |
更多
更多细节请查看 LightDB 官方文档 http://www.postgres.cn/docs/13/sql-createtable.html