什么';SQL脚本增量更新表的逻辑/设计是否很好?
这张表大约有40000行,我想更新一下。这位同事说,最好是增量更新表,而不是完全删除和加载 因此,我尝试了一个脚本的设计和逻辑来实现这一点,但我的经验不足。我只是不知道增量更新表的效率和必要性 目前,仓库看起来是这样的:数据从源数据进入Teradata中的表(我们称之为T1)。然后它被发送到Teradata中的另一个表(我们称之为T2)中,并添加了一些字段,如timestamp。最后,出于安全原因,在最后一个表上构建了一个视图 因此,我考虑用T1中的数据创建一个临时/易失性表。这将包含脚本运行时的所有数据以及新记录。然后,检查整个表,查看T2中是否已经存在ID(主索引),如果不存在,则将其添加到另一个临时表中。然后以某种方式将第二个临时表与T2结合起来,覆盖T2并在其上构建一个视图 这有什么意义吗什么';SQL脚本增量更新表的逻辑/设计是否很好?,sql,database,teradata,Sql,Database,Teradata,这张表大约有40000行,我想更新一下。这位同事说,最好是增量更新表,而不是完全删除和加载 因此,我尝试了一个脚本的设计和逻辑来实现这一点,但我的经验不足。我只是不知道增量更新表的效率和必要性 目前,仓库看起来是这样的:数据从源数据进入Teradata中的表(我们称之为T1)。然后它被发送到Teradata中的另一个表(我们称之为T2)中,并添加了一些字段,如timestamp。最后,出于安全原因,在最后一个表上构建了一个视图 因此,我考虑用T1中的数据创建一个临时/易失性表。这将包含脚本运行时
还有可能会更新记录。因此,它们可能已经存在于T2中,但已经在T1的新版本中更新了数据。我认为比较从T1到T2的所有列的值会非常低效,但是想不出另一种方法来实现这一点,对于任何现代数据库来说,40000行的删除和插入应该是非常轻松的。更新同上 执行和增量删除/更新/插入的真正原因是,您可以在永久表中记录更改和时间戳行,以及N插入和/或上次更新的日期/时间。通常的技术是这样的:
您可能还注意到,在更新时,如果要检查列值的实际更改,where子句可能会变得有点复杂:如果没有任何更改,则更新行没有多大意义。有一个Teradata合并命令,您可能会发现它很有用,请查看此帖子: 如果需要在更多列上进行匹配,请在on语句中输入and 编辑:如果要使用MERGE,可能还需要使用类似nicholas帖子中的delete语句。“同事说最好以增量方式更新表,而不是完全删除并加载。”不一定。你能在不丢失信息的情况下用源数据替换T1吗?“增量更新”不同于“完全删除并加载”,基于你的源数据,你不能这样做#2。否则,这听起来像是一个简单的“updateelseinsert”策略,可以使用MERGE-INTO.Thank轻松实现。#1基本上是查找和删除从源数据中删除的行吗?
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
)
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);