PostgreSQL临时表

我需要执行一个查询250万次。 此查询生成一些我需要AVG(column) ,然后使用此AVG从低于平均值的所有值过滤表。 然后我需要将这些过滤的结果插入到表中。

做合理效率的唯一方法似乎是通过为每个query-postmaster python-thread创build一个TEMPORARY TABLE 。 我只是希望这些TEMPORARY TABLE不会永久保存到硬盘上,并且会保留在内存中(RAM),当然,除非它们没有工作内存。

我想知道一个TEMPORARY TABLE是否会引起磁盘写入(这会干扰INSERTS,即整个进程缓慢)

请注意,在Postgres中,临时表的默认行为是它们不会自动删除,数据在提交时被保存。 见ON COMMIT

但临时表在数据库会话结束时被删除 :

临时表会在会话结束时自动删除,或者在当前事务结束时自动删除。

您需要考虑多种考虑因素:

  • 如果您确实想要在事务结束时显式地DROP临时表,请使用CREATE TEMPORARY TABLE ... ON COMMIT DROP语法创build它。
  • 在存在连接池的情况下 ,数据库会话可能跨越多个客户端会话; 为了避免CREATE冲突,你应该删除临时表 – 在返回一个连接到池之前(例如,通过做一个事务中的所有内容并使用ON COMMIT DROP创build语法), 或者根据需要(通过在任何具有相应DROP TABLE IF EXISTS CREATE TEMPORARY TABLE语句之前,其优点是也在外部事务中工作,例如,如果在自动提交模式下使用连接。
  • 在临时表正在使用时,在溢出到磁盘之前,有多less内存将适合内存? 请参阅postgresql.conftemp_buffers选项
  • 当我经常使用临时表时,还有什么要担心的? 在删除了临时表之后,build议使用真空来清除目录中的所有死元组。 当使用默认设置( auto_vacuum )时,Postgres会每隔3分钟自动吸尘。

另外,与您的问题无关(但可能与您的项目有关):请记住,如果必须填充临时表之后运行查询,那么创build适当的索引并发出ANALYZE在完成插入之后 ,在临时表上。 默认情况下,基于成本的优化器将假定新创build的临时表具有〜1000行,如果临时表实际上包含数百万行,则这可能导致性能较差。

临时表只提供一个保证 – 它们在会议结束时被丢弃。 对于一张小桌子,您可能在后备商店中拥有大部分数据。 对于大型表格,我保证数据将定期刷新到磁盘,因为数据库引擎需要更多的工作空间来处理其他请求。

编辑:如果你是绝对需要RAM的临时表,你可以在RAM磁盘(/ dev / shm作品)上为你的数据库创build一个表空间。 这样可以减less磁盘IO的数量,但要注意,如果没有物理磁盘写入,目前还无法做到这一点; 数据库引擎将在创build临时表时将表列表刷新到稳定的存储空间。