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.conf
的temp_buffers
选项 - 当我经常使用临时表时,还有什么要担心的? 在删除了临时表之后,build议使用真空来清除目录中的所有死元组。 当使用默认设置(
auto_vacuum
)时,Postgres会每隔3分钟自动吸尘。
另外,与您的问题无关(但可能与您的项目有关):请记住,如果必须在填充临时表之后运行查询,那么创build适当的索引并发出ANALYZE
在完成插入之后 ,在临时表上。 默认情况下,基于成本的优化器将假定新创build的临时表具有〜1000行,如果临时表实际上包含数百万行,则这可能导致性能较差。
临时表只提供一个保证 – 它们在会议结束时被丢弃。 对于一张小桌子,您可能在后备商店中拥有大部分数据。 对于大型表格,我保证数据将定期刷新到磁盘,因为数据库引擎需要更多的工作空间来处理其他请求。
编辑:如果你是绝对需要RAM的临时表,你可以在RAM磁盘(/ dev / shm作品)上为你的数据库创build一个表空间。 这样可以减less磁盘IO的数量,但要注意,如果没有物理磁盘写入,目前还无法做到这一点; 数据库引擎将在创build临时表时将表列表刷新到稳定的存储空间。