在 PostgreSQL 中创建内存表?

Zer*_*uno 14 postgresql in-memory in-memory-database postgresql-12

我对内存表的理解是将在内存中创建的表,并且尽可能少地使用磁盘(如果有的话)。我假设我有足够的 RAM 来容纳该表,或者至少是大部分。我不想使用显式函数将表(如 pg_prewarm)加载到内存中,我只想在发出 aCREATE TABLE或时默认情况下表就在那里CREATE TABLE AS select statement,除非内存已满或除非我另有说明。我并不特别关心记录到磁盘。

7年前,有人在这里问过类似的问题PostgreSQL相当于MySQL内存表吗?。它已收到 2 个答复,其中一个有点晚了(4 年后)。

一个答案是创建一个 RAM 磁盘并为其添加一个表空间。或者使用 UNLOGGED 表。或者等待全局临时表。然而,我没有特殊的硬件,我只有普通的 RAM - 所以我不知道如何去做。我可以使用 UNLOGGED 功能,但据我了解,仍然涉及相当多的磁盘交互(这是我试图减少的),并且我不确定表是否会默认加载到内存中。此外,我不明白全局临时空间是如何相关的。我对它们的理解是它们只是可以共享的空间中的桌子。

另一个答案建议使用内存列存储引擎。然后使用函数将所有内容加载到内存中。我对这种方法的问题是,所提到的引擎看起来很旧并且没有维护,我找不到任何其他引擎。另外,我希望我不必明确地诉诸使用“加载到内存”功能,而是默认情况下一切都会发生。

我只是想知道 7 年后如何在 Postgres 12 中获取内存表。

Pav*_*ule 11

Postgres 没有内存表,而且我现在没有关于这个主题的任何严肃工作的任何信息。如果您需要此功能,那么您可以使用一种特殊的内存数据库,例如 REDIS、MEMCACHED 或 MonetDB。这些数据库有 FDW 驱动程序。因此,您可以在专门的数据库中创建内存表,并且可以通过外部表使用 Postgres 中的这些表。

当只有MyISAM引擎时,MySQL内存表是必要的,因为该引擎在IO方面的能力非常原始,而MySQL没有自己的缓冲区。现在 MySQL 有了 InnoDB 引擎(像其他数据库一样具有现代形式的联接),并且许多使用 MySQL 内存表的争论已经过时了。与旧的 MySQL 相比,Postgres 有自己的缓冲区并且不会绕过文件系统缓存,因此所有 RAM 都可用于您的数据,您无需执行任何操作。十年前,我们必须使用 MySQL 内存引擎才能获得足够好的性能。但迁移到 Postgres 后,我们在没有内存表的情况下获得了更好的性能。

如果你有大量内存,那么 Postgres 可以默认使用它 - 通过文件系统缓存。

  • 没有任何中间关系 - Postgres 有特殊的结构 - tuplestore。当这个结构体比较低的时候,然后是work_mem,那么数据就缓冲在内存中了。当数据较高时,则存储在临时文件中。 (2认同)