PostgreSQL临时表缓存在内存中?

时间:2013-01-04 18:39:35

标签: postgresql session caching transactions temp-tables

上下文

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

目标

我想要做的是创建临时表(如果它们已经不存在),尽可能将它们存储在内存中,如果在某些时候内存不足,请删除那些致力于HDD(我猜这些将是最近最少使用的)。

实施例

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

问题

  • 这是“on commit drop”的意思吗?我见过有关的描述 会话和交易,但我真的不明白 概念。对不起,如果问题很愚蠢。
  • 如果不是,你知道任何简单的方法让Postgres做 这个?

解决方法

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

非常感谢。

1 个答案:

答案 0 :(得分:4)

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

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

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

  2. 仅限本地可见,

  3. 未记录的。

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

    最终结果是你真的不必担心这个。 PostgreSQL在某种程度上已经尝试做你要求它做的事情,而临时表的磁盘I / O要求比标准表要低得多。它不会强制表保留在内存中,如果它们变得足够大,页面可能会到达操作系统磁盘缓存,最终到达磁盘。这是一个重要的功能,因为它确保当许多人创建许多大型临时表时性能会优雅地降低。