PostgreSQL临时表


76

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

做到这一点的唯一有效方法似乎是通过TEMPORARY TABLE为每个query-postmaster python-thread创建一个。我只是希望这些TEMPORARY TABLEs不会持久保存在硬盘驱动器上,并且会保留在内存(RAM)中,除非它们的内存不足。

我想知道是否TEMPORARY TABLE会引起磁盘写操作(这会干扰INSERTS,即使整个过程变慢)


5
你到底在问什么?

大声笑,对不起。我想知道是否TEMPORARY TABLE会引起磁盘写入(这会干扰INSERTS,即,使整个过程变慢)。谢谢!
尼古拉斯·伦纳德

好吧,我只是通读它。看来TEMPORARY TABLE确实确实在磁盘上产生了一些开销...但是我仍然想知道整个表的副本是否保留在磁盘上,还是保留了元数据?
尼古拉斯·伦纳德

Answers:


117

请注意,在Postgres中,临时表的默认行为是不会自动删除它们,并且提交后数据会持久保存。请参阅ON COMMIT

但是,临时表在数据库会话结束时删除

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

您必须考虑多个因素:

  • 如果确实要DROP在事务结束时显式创建一个临时表,请使用以下CREATE TEMPORARY TABLE ... ON COMMIT DROP语法创建它。
  • 在存在连接池的情况下,数据库会话可能会跨越多个客户端会话。为避免冲突CREATE,您应该删除临时表-在返回到池的连接之前(例如,通过在事务中进行所有操作并使用ON COMMIT DROP创建语法),根据需要(通过在任何CREATE TEMPORARY TABLE语句之前加上对应的)DROP TABLE IF EXISTS,它的优点是还可以处理外部事务,例如,如果连接在自动提交模式下使用。)
  • 在使用临时表时,在溢出到磁盘上之前,表中将容纳多少内存?请参阅中的temp_buffers选项postgresql.conf
  • 经常使用临时表时,我还有什么要担心的?建议删除DROP临时表后再进行清理,以清理目录中的所有无效元组。使用默认设置(auto_vacuum)时,Postgres将每3分钟自动为您清理一次。

另外,与您的问题无关(但可能与您的项目有关):请记住,如果填充临时表必须对临时表运行查询,那么创建适当的索引并发出ANALYZEon是一个好主意。完成插入的临时表。默认情况下,基于成本的优化器将假定新创建的临时表具有约1000行,如果临时表实际包含数百万行,则可能导致性能下降。


好东西。谢谢。实际上,我只使用了一个临时表,因为我需要在其上执行两个不同的SELECT(因此,我想分析不值得)。我为操作提供了许多temp_buffers,但是由于TEMP表是由许多python线程创建和删除的,所以……
Nicholas Leonard

随着脚本的完成,postgres正在消耗越来越多的RAM。我发现将python线程(在客户端计算机上运行)的数量限制为比cpu-cores的数量多一点,可以实现最佳(最有效和最有效)的执行时间。再次感谢你,智慧弗拉德。
尼古拉斯·伦纳德

1
即使您只在临时表上进行两次SELECT,在创建临时表时每次花费几毫秒来创建索引+进行分析,当/如果将其他表与临时表结合在一起,也可以节省大量时间-将查询手动放入PgAdminIII和使用“查询/解释(F7)”功能。
vladr

真?好的,我想我需要有人告诉我尝试一下,因为这似乎很不直观(设置成本似乎不值得)。无论如何,我感谢您,下次我将尝试分析ANALYZE。我已经看到了TEMP INDEXs思想的价值。但是我不知道分析是否真的...
Nicholas Leonard

1
ANALYZE开销平均为100毫秒,您可以按表/列配置它。您绝对需要进行分析,以使优化程序不做任何愚蠢的假设,假设一百万行的表仅包含100行并对其进行表扫描10次... :)
vladr

19

临时表仅提供一种保证-在会话结束时将其删除。对于一个小表,您可能会将大多数数据存储在后备存储中。对于大表,我保证数据会定期刷新到磁盘,因为数据库引擎需要更多的工作空间来处理其他请求。

编辑:如果您绝对需要仅RAM的临时表,则可以在RAM磁盘上为数据库创建表空间(/ dev / shm可以使用)。这样可以减少磁盘IO的数量,但是请注意,如果没有物理磁盘写操作,目前无法执行此操作。当您创建临时表时,数据库引擎会将表列表刷新到稳定的存储中。


1
临时表也不是WAL记录的rhaas.blogspot.com/2010/05/…–
shusson
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.