描述
我和python3一起使用Postgres
表中有1700万行,最大ID 3000 million+
我的任务是select id,link from table where data is null;,.And,做一些代码,他们Update table set data = %s where id = %s。
我测试了一个数据更新需要0.1s。
我的思想
以下是我的想法
radis soon.But我不知道怎么做。此外,连接的最佳数量是多少?
我以前做过5-6次连接。现在只有两个连接,但是better.One小时更新了200万个数据。
发布于 2016-11-25 09:34:28
如果有任何方法可以将新值的计算推入数据库,即发出一个大型UPDATE语句,如
UPDATE "table"
SET data = [calculation here]
WHERE data IS NULL;你会更快。
但是在剩下的讨论中,我将假设您必须计算代码中的新值,即运行一个SELECT来获取data IS NULL所在的所有行,然后发出大量的UPDATE语句,每个语句都针对单个行。
在这种情况下,有两种方法可以大大加快处理速度:
- Drop all indexes after selecting the rows to change and before the `UPDATE`s and recreate them after processing is completed. --如果您更新了足够多的行,这将是一次净胜利。-确保data上没有索引,并且创建表时的https://www.postgresql.org/docs/9.6/static/sql-createtable.html#SQL-CREATETABLE-STORAGE-PARAMETERS小于50。然后,数据页中有足够的空间将更新写入与原始行版本相同的页面,这样就不需要更新索引(这称为https://git.postgresql.org/gitweb/?p=postgresql.git;a=blob_plain;f=src/backend/access/heap/README.HOT更新)。
对于您来说,这可能不是一个选项,因为您可能没有使用那样的填充因子创建表,但为了完整起见,我想添加它。
UPDATE将在自己的事务中运行,事务将在语句末尾提交。但是,每个COMMIT都强制将事务日志(https://www.postgresql.org/docs/current/static/wal-intro.html)写入磁盘,这大大减慢了处理速度。
为此,您可以在第一个BEGIN之前显式地发出一个UPDATE,在最后一个UPDATE之后发出一个COMMIT。这还将使整个操作具有原子性,以便在处理中断时自动取消所有更改。https://stackoverflow.com/questions/40799563
复制相似问题