如何改进更新?

时间:2016-11-25 07:15:43

标签: database postgresql

描述

我将Postgres与python3一起使用

表中有1700万行,最大ID为3000万+

我的任务是select id,link from table where data is null;。然后对其进行编码Update table set data = %s where id = %s

我测试了单个数据更新需要0.1s

我的想法

以下是我的想法

  • 尝试新数据库,我很快就听到了radis。但我不知道该怎么做。

此外,最佳连接数是多少?

我曾经做过5-6个连接。 现在只有两个连接,但更好。一个小时更新了200万个数据。

1 个答案:

答案 0 :(得分:0)

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

UPDATE "table"
SET data = [calculation here]
WHERE data IS NULL;

你会快得多。

但是对于本讨论的其余部分,我假设您必须计算代码中的新值,即运行一个SELECT以获取data IS NULL所有行,然后发出很多UPDATE语句,每个语句都针对一行。

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

  1. 避免索引更新

    更新索引比向表本身添加元组更昂贵(适当的所谓的,在其上快速轻松地堆积条目)。因此,通过避免索引更新,您将会更快。

    有两种方法可以避免索引更新:

    • 选择要更改的行并在UPDATE之前删除所有索引,并在处理完成后重新创建它们。

      如果您更新足够的行,这将是一个净胜利。

    • 确保data上没有索引,并且创建的表的fillfactor小于50,然后在数据页中有足够的空间来编写更新到与原始行版本相同的页面,这样就无需更新索引(这称为 HOT更新)。

      这可能不是你的选择,因为你可能没有用这样的fillfactor创建表,但是我想添加它以保证完整性'缘故。

  2. 在单个交易中捆绑许多更新

    默认情况下,每个UPDATE将在其自己的事务中运行,该事务在语句结束时提交。但是,每个COMMIT强制将事务日志(WAL)写入磁盘,这会大大减慢处理速度。

    您可以在第一个BEGIN之前明确发出UPDATE,在最后一个之后明确发出COMMIT。这也将使整个操作成为原子操作,以便在处理中断时自动撤消所有更改。