我需要执行250万次查询.这个查询生成了一些行,我需要将其设置为AVG(column),然后使用这个AVG从表中筛选出所有低于平均值的值.然后我需要将这些结果过滤到表INSERT中.

要以合理的效率完成这样的事情,唯一的方法似乎是 for each 查询postmaster python线程创建一个TEMPORARY TABLE.我只是希望这TEMPORARY TABLE个不会被持久化到硬盘上(根本),而是留在内存中(RAM),当然,除非它们没有工作内存.

我想知道临时表是否会导致磁盘写入(这会干扰插入,即整个过程会减慢)

推荐答案

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

然而,临时表为dropped at the end of a database session:

在会话结束时自动删除临时表,或

您必须考虑多种因素:

  • 如果确实希望在事务结束时显式地创建一个临时表,请使用CREATE TEMPORARY TABLE ... ON COMMIT DROP语法创建它.
  • In the presence of connection pooling,数据库会话可以跨越多个客户端会话;为了避免CREATE中的冲突,您应该删除临时表——或者在返回到池的连接之前(例如,通过在事务中执行所有操作并使用ON COMMIT DROP创建语法),or(根据需要)(在任何CREATE TEMPORARY TABLE语句之前加上相应的DROP TABLE IF EXISTS,这样做的优点是也可以在事务之外工作,例如,如果连接在自动提交模式下使用.)
  • 在使用临时表时,有多少临时表在溢出到磁盘之前可以放入内存?参见postgresql.conf中的temp_buffers选项
  • 当我经常使用临时表时,还有什么我应该担心的吗?建议在删除临时表后使用真空吸尘器,以清除目录中的所有死元组.当使用默认设置(auto_vacuum)时,Postgres将每隔3分钟左右自动为您吸尘.

此外,与您的问题无关(但可能与您的项目有关):请记住,如果您必须对已填充的临时表after运行查询,那么最好创建适当的索引,并在问题after中的临时表上输入ANALYZE.默认情况下,基于成本的优化器将假定新创建的临时表有约ANALYZE0行,如果临时表实际包含数百万行,这可能会导致性能不佳.

Postgresql相关问答推荐

为什么Postgres在打印时能完全缩短时间跨度?

无法继承BYPASSRLS

在 Postgresql 中实现自定义运算符时出错

返回行值和行计数的总和

postgresql中多个左连接的空结果

AGE Graph 实际上存储为 postgreSQL 表,对吧?如何检索该表(不是图表)?

查找行中的最小值

如何在postgres中查询多行

我在try 访问我的数据库表时在 postgresql 中收到 aclcheck_error 错误

PostgreSQL - 如何获得前一个月和一周的价值?

有没有办法使用postgresql将具有不同ID的同一行多次添加到表中?

如何将 grafana 与 Google Cloud SQL 集成

如何在 Sequelize ORM 中插入 PostGIS GEOMETRY 点?

DbProviderFactory 与 Npgsql?

Flask-SQLAlchemy db.session.query(Model) 与 Model.query

PostgreSQL 提示:You will need to rewrite or cast the expression. column "state" is of type status but expression is of type character varying

适配器 Ecto.Adapters.Postgres 未编译

如何为 Postgres psql 设置时区?

PostgreSQL - 作为表名的动态值

Rails ActiveRecord:PG::Error:错误:column reference "created_at" is ambiguous