快速查询根据另一个表刷新POSTGRES表

时间:2017-03-25 19:04:10

标签: sql performance postgresql

我有一张外表 A ,其中包含 foo bar baz qux列即可。列 foo 具有UNIQUE约束。

我有另一张表 B ,其列 id foo bar baz < / strong>。

B 取决于表 A ,首先通过将 A 中的所有行插入 B 进行初始化,忽略列 qux 并生成唯一的 id

A 每小时刷新一次,每小时后将替换为一张全新的表格。然后我还需要更新 B

我想知道什么是最快的查询

1)更新 B 中的所有行,其中 A 中的行具有相同的 foo 值,并且条形 baz 已更改 bar baz 的新值。

2)插入 A 中的所有行,其中 B 中没有行,且 foo 值相同。

3)删除 B 中的所有行, A 中没有行,且 foo 值相同。

postgresql 中有哪些相应的最佳查询,可以尽快完成这三项操作。

1 个答案:

答案 0 :(得分:1)

您需要在UNIQUEfoob约束。

1)和2)

INSERT INTO b (foo, bar, baz)
   (SELECT foo, bar, baz FROM a)
ON CONFLICT foo
   DO UPDATE SET bar = EXCLUDED.bar,
                 baz = EXCLUDED.baz
      WHERE bar <> EXCLUDED.bar
         OR baz <> EXCLUDED.baz;

3):

DELETE FROM b
WHERE NOT EXISTS
         (SELECT 1
          FROM a
          WHERE b.foo = a.foo
         );

但我认为在ba成为materialized view并刷新它是更好的解决方案。