sql - 我如何优化这个更新每一行的 PostgreSQL 查询?

标签 sql performance postgresql query-performance

我写了一个查询来更新整个表。我怎样才能改进这个查询以减少时间:

update page_densities set density = round(density - 0.001, 2)

Query returned successfully: 628391 rows affected, 1754179 ms (29 minutes) execution time.

编辑:通过设置工作内存..

set work_mem = '500MB';
update page_densities set density = round(density - 0.001, 2)

Query returned successfully: 628391 rows affected, 731711 ms (12 minutes) execution time.

最佳答案

假设密度不是索引,您可以使用不同的填充因子来提高性能。有关详细信息,请参阅此问题/答案或 PostgreSQL 文档:

http://www.postgresql.org/docs/9.4/static/sql-createtable.html

Slow simple update query on PostgreSQL database with 3 million rows

虽然您无法修改表的填充因子,但您可以创建一个具有不同填充因子的新表并将数据复制过来。这是一些示例代码。

--create a new table with a different fill factor
CREATE TABLE page_densities_new
(
 ...some fields here
)
WITH (
  FILLFACTOR=70
);

--copy all of the records into the new table
insert into page_densities_new select * from page_densities;

--rename the original/old table
ALTER TABLE page_densities RENAME TO page_densities_old;

--rename the new table
ALTER TABLE page_densities_new RENAME TO page_densities;

在此之后,您将得到一个与原始表具有相同名称和数据的表,但它具有不同的填充因子。我将它设置为 70,但它可以是 10 到 100 之间的任何值。(默认值为 100)

关于sql - 我如何优化这个更新每一行的 PostgreSQL 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30189031/

相关文章:

performance - 通过多处理提高代码结果速度

sql - PostgreSQL trigram Indexes in characters < 3 行为

c++ - 使用 dbms_pipe 插入来自繁重事务的数据

java - 为什么scala写的代码比java慢6倍?

sql - 当使用外键向数据库添加新项目时,是否应该使用 SQL 触发器在其他表中创建相关行?

c++ - 使用 STL vector 作为字节数据的 FIFO 容器

postgresql - 如何在 Flask-SQLAlchemy 中执行多个 "order_by"?

django - 在 Digital Ocean Droplet 中更新 Django postgresql 数据库?

mysql - 使用 MySQL 将 2 列子查询转换为 1 列子查询

sql - Postgresql 中具有 Hash Join 的加速查询