首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何改进更新?

如何改进更新?
EN

Stack Overflow用户
提问于 2016-11-25 07:15:43
回答 1查看 34关注 0票数 0

描述

我和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万个数据。

EN

回答 1

Stack Overflow用户

发布于 2016-11-25 09:34:28

如果有任何方法可以将新值的计算推入数据库,即发出一个大型UPDATE语句,如

代码语言:javascript
复制
UPDATE "table"
SET data = [calculation here]
WHERE data IS NULL;

你会更快。

但是在剩下的讨论中,我将假设您必须计算代码中的新值,即运行一个SELECT来获取data IS NULL所在的所有行,然后发出大量的UPDATE语句,每个语句都针对单个行。

在这种情况下,有两种方法可以大大加快处理速度:

  1. 避免索引更新 更新索引比将元组添加到表本身(适当的所谓堆,它可以快速而容易地堆叠条目)花费更多。因此,通过避免索引更新,您将变得更快。 有两种避免索引更新的方法:
代码语言:javascript
复制
- 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更新)。

对于您来说,这可能不是一个选项,因为您可能没有使用那样的填充因子创建表,但为了完整起见,我想添加它。

  1. 将多个更新捆绑在一个事务中 默认情况下,每个UPDATE将在自己的事务中运行,事务将在语句末尾提交。但是,每个COMMIT都强制将事务日志(https://www.postgresql.org/docs/current/static/wal-intro.html)写入磁盘,这大大减慢了处理速度。 为此,您可以在第一个BEGIN之前显式地发出一个UPDATE,在最后一个UPDATE之后发出一个COMMIT。这还将使整个操作具有原子性,以便在处理中断时自动取消所有更改。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40799563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档