我在Postgres有两张桌子:
Sources [id, term, type]
Posts [id, source_id, message, term, type]
我正在对这些数据进行反规范化,因此我在每个帖子中添加了术语和类型列,并删除了Sources表。
有没有办法做一个FAST查询,用每个相应的源数据更新帖子(大约有800万个帖子)。
类似的东西:
UPDATE posts
JOIN sources
ON posts.source_id = sources.id
SET post.term = sources.term,
posts.term_type = sources.term_type;
但这对我来说是一个语法错误。
答案 0 :(得分:2)
Postgres中的正确语法是:
UPDATE posts
SET posts.source = sources.source,
post.term = sources.term,
posts.term_type = sources.term_type
FROM sources
WHERE posts.source_id = sources.id;
或者,您可以使用行构造函数:
UPDATE posts
SET (source, term, term_type) = (select s.source, s.term, s.term_type
from source s
where posts.source_id = s.id
);
答案 1 :(得分:1)
在postgres中,每次更新都包含一个def inf_repeat(N):
return chain.from_iterable(repeat(i, N) for i in count(1))
和一个insert
。因此,如果索引处于活动状态,那么除了双重工作之外也会产生影响。
如果你想要更新整个表,通常要快得多,只需用新值创建表
delete
然后使用CREATE TABLE post2 AS
SELECT p.id, p.source_id, p.message, s.term, s.term_type.
FROM posts p
INNER JOIN source s
ON p.source_id = s.id;
重命名ALTER
并创建正确的索引。