如何使用postgres以优化的方式更新大表

时间:2013-01-09 10:02:26

标签: postgresql

我正在使用postgresql。我有一张约有1000万条记录的表格。我需要使用序列更新表中的列'a'。此列需要按照另一列“b”的顺序进行更新。因此,对于任何两个记录r1和r2,如果r1的'a'值小于r2的'a'值,则r1的'b'值必须小于r2的'b'值。

我正在使用这样的东西:

UPDATE table 
SET col1 = nextval('myseq') 
WHERE key IN (SELECT key 
              FROM table 
              ORDER BY col2);

key是表的主键。

但这花费了太多时间。任何人都可以帮助我以优化的方式做到这一点。

由于

2 个答案:

答案 0 :(得分:0)

根本不要使用更新。

像这样使用SELECT INTO:

SELECT *, nextval('myseq') AS col1
INTO new_table
FROM 
(
    SELECT *
    FROM table
    ORDER BY key
) AS sorted

然后用新的替换旧表。您必须重新创建所有索引并强化主键。

Postgres不会替换它更新的每一行,它会为该行添加第二个条目并弃用旧行。因此,如果您正在进行数百万次更新,那么访问速度将非常慢。替换整个表通常是您的最佳选择。

答案 1 :(得分:0)

尝试类似:

UPDATE table t
SET col1 = t2.new_col1 
FROM (SELECT t2.key, nextval('myseq') as new_col1
      FROM table t2
      ORDER BY t2.col2) t2 
WHERE t1.key = t2.key;

或者更好的东西:

UPDATE table t
SET col1 = t2.new_col1 
FROM (SELECT t2.key, 
             row_number() OVER (ORDER BY t2.col2) as new_col1
      FROM table t2) t2 
WHERE t1.key = t2.key;