PostgreSQL中的内存表

19

我该如何在PostgreSQL中创建一个内存表?

3个回答

21
使用适合您操作系统的软件创建一个 RAM 磁盘。使用 CREATE TABLESPACE 命令在 RAM 磁盘上 创建 一个数据库集群。当您 创建 表时,请使用 TABLESPACE 子句。显然,除非您保存 RAM 磁盘,否则 RAM 表将不会在系统重新启动后保留。

1
根据 https://www.2ndquadrant.com/en/blog/postgresql-no-tablespaces-on-ramdisks/ 的说法,这样做是非常危险的,因为它可能会阻止其他表空间的恢复,导致写前日志的重放失败! - Sebastien
哦,这很危险。我想知道在支持内存映射文件的操作系统上使用内存映射文件是否更安全。 - Andrew Lazarus
1
也许将ramdisk表空间与未记录表相结合可以避免问题,因为理论上WAL不应包含此表的任何内容,因此重放不会失败? - Sebastien

13

实际上它并不是一个内存表,但是你可以创建一个全局临时表:

create global temporary table foo (a char(1));

不能保证它会一直存储在内存中,但很可能会(除非是一个巨大的表)。

您还可以考虑使用PostgreSQL 9.1的非记录表,这将在性能上获得更好的表现,但无法成为事务的一部分(它们的写操作不会在WAL中维护)。


非常感谢您的快速回答。 - Handsome Nerd
17
在 PostgreSQL 中,“全局”只是噪音,可能对与其他关系型数据库的兼容性有用。引用手册上的话:“可以在 TEMPORARY 或 TEMP 前面加上 GLOBAL 或 LOCAL。在 PostgreSQL 中,这没有任何区别…” - Erwin Brandstetter
你知道临时表是否有设置来限制它占用内存的大小吗? - tothphu

5
你也可以考虑使用PostgreSQL 9.1的非记录表(unlogged tables),这将带来更好的性能,但代价是不能成为事务的一部分(它们的写操作不会维护在WAL中)。
来自@PabloSantaCruz的样例。
摘自https://www.compose.com/articles/faster-performance-with-unlogged-tables-in-postgresql/
CREATE UNLOGGED TABLE "EUR/USD_ticks"  
(
  dt timestamp without time zone NOT NULL,
  bid numeric NOT NULL,
  ask numeric NOT NULL,
  bid_vol numeric,
  ask_vol numeric,
  CONSTRAINT "EUR/USD_ticks_pkey" PRIMARY KEY (dt)
)

我计划尝试这个方法,并认为它值得拥有自己的答案供用户投票选择(即“长尾”)。


@PabloSantaCruz 如果您分叉(fork)您的答案,以便我们可以“投票”支持 UNLOGGED,我很乐意删除此重复答案。 - yzorg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接