PostgreSQL临时表缓存在内存中?

Try*_*lks 5 postgresql session caching transactions temp-tables

背景:

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

目标:

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

示例:

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

问题:

  • 这是"提交下降"的意思吗?我已经看过关于会话和交易的描述,但我并不真正理解这些概念.对不起,如果这个问题很愚蠢.
  • 如果不是,你知道任何简单的方法让Postgres这样做吗?

解决方法:

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

非常感谢你.

Chr*_*ers 4

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

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

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

  2. 仅本地可见,并且

  3. 未登录。

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

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