内存中的PostgreSQL临时表缓存



上下文

我想在一些临时表中存储一些临时结果。这些表可能会在几个查询中重复使用,这些查询可能会在很短的时间内发生,但在某个时候,我使用的进化算法可能不再需要一些旧表,并不断生成新表。将有几个查询,可能同时使用这些表。只有一个用户执行所有这些查询。我不知道这是否澄清了关于会议等的一切,我仍然不确定这是如何运作的。

目标

我想做的是创建临时表(如果它们还不存在(,尽可能地将它们存储在内存中,如果在某个时候内存不足,则删除那些将提交到HDD的表(我想这些表将是最近使用最少的(。

示例

客户将对具有不同参数的EMA进行查询,并将其聚合为具有不同系数的EMA,每个人可能在所使用的系数方面有所不同,因此EMA的参数可能会重复,因为它们仍在基因库中,并且可能在一段时间后不需要。将有更多参数的类似查询,并且遗传算法将找到参数的正确值。

问题

  • 这就是"提交时丢弃"的意思吗?我看过关于会话和事务,但我并不真正理解概念。如果这个问题很愚蠢,我很抱歉
  • 如果不是,你知道有什么简单的方法可以让Postgres做吗这个

解决方案

在最坏的情况下,我应该能够猜测我可以在内存中保留多少表,并尝试自己实现LRU,但它永远不会像Postgres那样好。

非常感谢。

这是一个复杂的主题,可能需要深入讨论。我认为有必要解释一下为什么PostgreSQL不支持这一点,以及你可以用最新版本做些什么来接近你想要做的事情

PostgreSQL有一种很好的方法可以跨多个用户缓存不同的数据集。一般来说,如果临时表变得很大,您不希望允许程序员指定必须将其保留在内存中。然而,临时表的管理与正常表的管理截然不同,因为它们是:

  1. 由单个后端缓冲,而不是共享缓冲

  2. 仅本地可见,并且

  3. 未记录。

这意味着通常不会为临时表生成大量磁盘I/O。这些表通常不会刷新WAL段,它们由本地后端管理,因此不会影响共享缓冲区的使用。这意味着只有偶尔才会将数据写入磁盘,并且只有在必要时才能为其他(通常更频繁(任务释放内存。您当然不需要强制进行磁盘写入,而只需要在其他东西耗尽内存时进行磁盘读取。

最终的结果是,你真的不需要担心这个。PostgreSQL已经在一定程度上尝试了你要求它做的事情,临时表的磁盘I/O要求比标准表低得多。尽管如此,它并没有强制表留在内存中,如果它们变得足够大,页面可能会过期到操作系统磁盘缓存中,并最终到达磁盘。这是一个重要的功能,因为它可以确保当许多人创建许多大型临时表时,性能会适度下降。

最新更新