假设我有一个表main,并定期拍摄两个快照t0
和t1
。它具有用于软删除的is_deleted列。
create table t0 as select * from main;
-- wait 1 day
create table t1 as select * from main;
Q1.这个命令是否会创建主表更改的增量快照?
create table main_diffs as
select * from t1 except
select * from t0;
Q2.这些命令是否重建t1快照时间的main状态(无索引等)?
create table main_reconstituted as select * from t0;
insert into main_reconstituted select * from main_diffs;
以此类推,每天根据$ t{n-1} $捕获表$ t_{n}$?
上下文:每天捕获大型表的更改,以便通过带宽有限的网络进行分发。
涉及的数据库:postgresql、sqlite、duckdb。
1条答案
按热度按时间k97glaaz1#
这两个问题的答案都是“可能”
对于Q1,如果表结构未发生变化,包括:列顺序、添加或删除列或列数据类型;则查询导致递增的行级别差异。
对于Q2,如果满足上面列出的Q1的约束,并且插入行但从不更新,则最终结果将是main_reconstructed具有与main相同的内容。如果允许对main进行更新并且存在合适的唯一密钥,则可以使用
INSERT ... ON CONFLICT UPDATE ...
来实现所需的结果。避免在查询中使用
*
,特别是当列顺序可能影响结果时。如果不允许更新,并且主键是单调递增的值,那么通过选择main中主键值大于前一天快照中最大值的所有行,也可以更有效地创建main_diff。