5

上下文

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

目标

我想做的是创建临时表(如果它们不存在),尽可能将它们存储在内存中,如果在某些时候没有足够的内存,删除那些将提交给硬盘(我猜这些将是最近最少使用的)。

例子

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

问题

  • 这就是“on commit drop”的意思吗?我看过有关会话和事务的描述,但我并不真正理解这些概念。对不起,如果这个问题很愚蠢。
  • 如果不是,您是否知道让 Postgres 执行此操作的任何简单方法?

解决方法

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

非常感谢。

4

1 回答 1

4

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

PostgreSQL 有一个很好的方法来缓存多个用户的不同数据集。通常,您不想让程序员指定如果临时表变得非常大,则必须将其保存在内存中。然而,临时表的管理方式与普通表完全不同,因为它们是:

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

  2. 仅在本地可见,并且

  3. 未登录。

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

最终结果是你真的不需要担心这个。PostgreSQL 已经在一定程度上尝试去做你要求它做的事情,并且临时表的磁盘 I/O 要求比标准表低得多。它不会强制表保留在内存中,如果它们变得足够大,页面可能会在 OS 磁盘缓存中过期,并最终在磁盘上。这是一个重要的特性,因为它确保在许多人创建许多大型临时表时性能会优雅地降低。

于 2013-04-20T06:25:51.707 回答