我正在使用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是表的主键。
但这花费了太多时间。任何人都可以帮助我以优化的方式做到这一点。
由于
答案 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;