0

我正在使用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 是表的主键。

但这需要太多时间。任何人都可以帮助我以优化的方式进行操作。

谢谢

4

2 回答 2

0

根本不要使用更新。

像这样使用 SELECT INTO:

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

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

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

于 2013-01-09T10:06:16.437 回答
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;
于 2013-01-09T10:32:50.617 回答