【问题标题】:What's a good logic/design of a SQL script to incrementally update a table?增量更新表的 SQL 脚本的良好逻辑/设计是什么?
【发布时间】:2014-09-05 02:34:24
【问题描述】:

所以我希望更新这张只有大约 40,000 行的表。同事说最好增量更新表,而不是完全删除和加载。

因此,我尝试通过计算脚本的设计和逻辑来执行此操作,但我缺乏经验。我只是不知道增量更新表有什么效率和不需要。

目前,仓库看起来是这样的:数据来自源到 Teradata 中的一个表(我们称之为 T1)。然后它被发送到 Teradata 中的另一个表(我们称之为 T2),并添加了一些字段,例如时间戳。最后,出于安全原因,在最后一个表上构建了一个视图。

因此,我正在考虑使用来自 T1 的数据创建一个临时/易失性表。这将拥有直到脚本与新记录一起运行时的所有数据。然后,遍历整个表,查看 T2 中是否已经存在 ID(主索引),如果不存在,则将其添加到另一个临时表中。然后以某种方式将第二个临时表与 T2 组合并覆盖 T2 并在其上构建一个视图。

这有意义吗?

还有记录被更新的可能性。所以它们已经存在于 T2 中,但在新版本的 T1 中更新了数据。我认为比较从 T1 到 T2 的所有列的值效率非常低,但想不出另一种方法来做到这一点

【问题讨论】:

  • “同事说最好增量更新表,而不是完全删除和加载。”不一定。 能否用您的源数据替换 T1 而不会丢失信息?
  • “增量更新”不同于“完全删除和加载”,根据您的源数据,您无法执行 #2。否则,这听起来像是一个简单的“更新其他插入”策略,可以使用 MERGE INTO 轻松实现。

标签: sql database teradata


【解决方案1】:

对于任何现代数据库来说,40,000 行的删除和插入都应该非常轻松。更新同上。

这样做和增量删除/更新/插入的真正原因是,您可以在永久表中记录更改和时间戳行以及插入的日期/时间和/或上次更新。通常的技术是这样的:

  1. 从永久表中删除临时表中不存在的行
  2. 更新两个表中存在的行
  3. 插入存在于临时表中但不存在于永久表中的行。

看看Teradata docs,会是这样的(不保证这在语法上是正确的,因为我没有 Teradata 实例可玩):

delete permanent p
where not exists ( select *
                   from temp t
                   where t.id = p.id
                 )
update p
from permanent p ,
     temp      t
set ...
where t.id = p.id

insert permanent
select ...
from temp t
where not exists ( select *
                   from permanent p
                   where p.id = t.id
                 )

有人可能会注意到,如果涉及相关的外键约束,删除操作可能会有点麻烦。

人们可能还会注意到,在更新时,where 子句可能会变得有点……如果您想检查列值的实际更改会变得复杂:如果没有任何更改,更新行没有多大意义。

【讨论】:

  • 谢谢。 #1 基本上是查找和删除从源数据中删除的行吗?
【解决方案2】:

有一个 Teradata MERGE 命令可能对您有用,请查看此帖子:

https://forums.teradata.com/forum/database/merge-syntax-simple-version

merge into merge_tmp as t using (select 1 as a,'stf' as b,'uuj' as c)  as s
on t.a = s.a
when matched then update set c = s.c
when not matched then insert values (s.a,s.b,s.c);

如果您需要匹配更多列,只需在 on 语句中添加一个 and。

编辑:如果您想使用 MERGE,您可能还需要使用删除语句,如 nicholas 帖子中的语句。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多