我制作SSIS
套餐时遇到问题。任何人都可以提供帮助吗?
情况如下:
我有两张桌子:A
& B
,结构相同。但它们存储在不同的服务器上。
我已经制作了一个SSIS
软件包,用于将数据从A
传输到B
(一次大约一百万行,需要一到两分钟)。
之后,我希望在转移到A
后删除表B
的数据。我写的SSIS
包将遵循这一点。我使用merge join
和Conditional Split
命令选择相同的数据。
之后我使用OLE DB
命令删除表A
的数据(只需使用"Delete RE_FormTo Where ID=?"
SQLCommand删除)。它可以工作,但它太慢了!删除重复数据大约需要一个小时!有谁知道更有效的方法吗?
答案 0 :(得分:2)
由于SSIS包设计不佳,执行速度肯定会很慢。 请参阅文档Best Practices of SSIS Design
让我向您解释一下您的包裹中的错误。
1.您正在使用阻塞转换(排序组件)。这些转换不会重复使用输入缓冲区,但会为输出创建一个新的缓冲区,并且它们大多比同步组件(如查找,派生列等)尝试更慢重新使用输入缓冲区。 根据MSDN
Do not sort within Integration Services unless it is absolutely necessary. In
order to perform a sort, Integration Services allocates the memory space of the
entire data set that needs to be transformed. If possible, presort the data before
it goes into the pipeline. If you must sort data, try your best to sort only small
data sets in the pipeline. Instead of using Integration Services for sorting, use
an SQL statement with ORDER BY to sort large data sets in the database – mark
the output as sorted by changing the Integration Services pipeline metadata
on the data
source.
2.Merge Join是一个semi-blocking transformation
,它会妨碍性能但远低于Blocking transformation
有两种方法可以解决问题
使用执行SQL任务并编写合并SQL
DECLARE @T TABLE(ID INT);
Merge @TableA as target
using @TableB as source
on target.ID=source.ID
when matched then
Delete OUTPUT source.ID INTO @T;
DELETE @TableA
WHERE ID in (SELECT ID
FROM @T);
答案 1 :(得分:0)
加入两个表后,只需插入Sort
元素,他就会删除重复项....
http://sqlblog.com/blogs/jamie_thomson/archive/2009/11/12/sort-transform-arbitration-ssis.aspx