我用脚本组件创建了一个SSIS包,该脚本组件从JSON API调用数据并将其插入SQL Server中的表中。我已经设置了添加新行的逻辑,但是我想找到删除/覆盖旧行的最合适方法。数据每4小时获取一次,因此,每次运行包时,大约有1000行重叠。
我的第一个想法是在数据流任务之后简单地添加一个SQL任务,以删除重复的行(具有最小的ID号)。但是,我想知道如何在“数据流任务”中执行此操作?每次API调用最多提取5000行,目标表大约有1m行,并且整个项目的运行时间约为。 10秒
我简单的数据流任务如下:
答案 0 :(得分:2)
您可以尝试两种主要方法:
对行ID运行查找。如果匹配,请使用UPDATE语句为每行运行OLEDB命令转换。如果不匹配-将行直接定向到OLE DB目标。
易于实现,简单明了的逻辑,但是大量的UPDATE语句将导致性能问题。
在数据库中创建一个中间表,在运行数据流任务之前将其清理,然后将数据流中的所有行存储到该中间表中。然后在下一个任务上-执行以下任一操作:
select
c.*
from
companies c
left join
workers w
on
c.id = w.company_id
group by
c.id
order by
count(w.id) desc;
中间表和主表。有关MERGE的更多信息。
在事务处理中-从中间表上存在的主表中删除行,然后执行MERGE
我通常更喜欢采用MERGE的中间表方法-高性能,简单且灵活。在并发会话或集群列存储表中运行时,MERGE语句可能会产生不利影响,然后我将中间表与INSERT INTO <main table> SELECT ... FROM <intermediate table>
命令一起使用
答案 1 :(得分:2)