我有两张桌子
Husband
---------
id
name
....
和
Wife
---------
id
name
husband_id (REFERENCES husband)
...
现在我想扭转这种关系。这意味着丈夫应该有一个妻子参考妻子,妻子的丈夫应该被移除。
改变表格不是一种交易。但设置wife_id效率是。你应该看到有很多条目。
首先我尝试了简单的方法:
UPDATE husband h SET wife_id =
(SELECT id FROM wife w WHERE w.husband_id=h.id)
它首先在一个小型数据库上尝试,并意识到子选择是如此之慢,以至于实时数据库上的更新将花费> 4h,这是不可接受的。
那么,如何更快地解决这个问题?
顺便说一下。它是Postgres 9.3.5数据库,afaik没有设置特殊索引。
答案 0 :(得分:1)
您可以使用JOIN,它应该比共同相关的子查询更快:
UPDATE husband h
SET wife_id = w.id
FROM wife w
WHERE w.husband_id = h.id;
答案 1 :(得分:0)
a_horse_with_no_name的解决方案带来了一些性能。但真正的绩效推动伴随着一个指数:
CREATE INDEX husband_id_index ON wife (husband_id);
REINDEX INDEX alt_md_index; -- not sure if this isn't required
索引查询本身只用了5秒钟。但是连接查询的速度提高了大约30,000倍,并且在大约30秒内完成。我非常惊讶,并且会更频繁地使用索引。