2013-03-22 62 views
0

我试图通过SSIS包传输大约10亿行而不稳定的行。因此,它一直在失败。我想要一些方法使其可重新启动。我试图在源和目标之间进行查找转换,但这样做太慢了。有没有另一种方法可以做到我想要做的事情,而不会造成这样的性能下降?SSIS增量负载

回答

2

我最初的方法是编写一个包,当它启动时,它会识别要传输的数据子集,记录它正在处理的子集并尝试传输该数据。如果它完成了,那么它表明数据已经被转移并退出。否则,它已经被炸毁了,这个软件包没有什么可做的。

另一个过程将运行X时间帧并尝试查找失败的传输(标记为正在处理但Y比Y持续时间更早的子集)。然后,它会从转移表中删除这些行或将其标记为符合传输条件。总的想法是,打破的东西被标记为一个结束。

这是一个非常简单的设计,最难的部分是分割并跟踪哪些内容尚未传输,然后设置SQL代理作业以每N个时间帧启动一次包。如果不是你的网络出现故障,那么像这样做数据传输的好处就是它允许你并行执行你的执行,这样你可以获得最大的吞吐量。当他们设置record加载数据时,SSIS团队采取了类似的方法。他们也从体系中走出了阴霾,但这也是预料之中的。

如果1B行系统有很多更新正在进行,那么您的数据分段逻辑将需要一些机制来识别更改并确保这些记录被反馈到系统中,但由于您没有将此指定为需求,现在我会忽略它。

如果您正在尝试使用查找,请确保您只撤回了绝对必需的内容。对于这种情况,我希望这是一个非常狭窄的关键。如果您采用分段数据加载方法,那么确保在查找转换中使用相同的分区逻辑。否则,您将在最后一次运行中拉回(1B -1 * transferSize)数据行,这无疑会对您的劣质网络造成严重破坏。

很多普遍性,但如果你想在一个方面的更多细节唱出来。

1

是一次

DECLARE @Counter Int, @ReturnCode Int 
DECLARE @Rows INT = 1000000, @Goal INT = 1000000000 
    WHILE (@Counter * @Rows < @Goal) 
    BEGIN 
     EXEC @returncode = xp_cmdshell 'dtexec /f "C:\\path\\package.dtsx" /SET \\package.variables [User::Counter].Value;"' + CONVERT(VARCHAR(10), @Counter) + '"' 

     IF (@returncode = 0) 
     BEGIN 
      @Counter = @Counter + 1 
      PRINT 'Failed this at this time dude: ' + CONVERT(VARCHAR(30), GETDATE()) 
     END 
    END 

然后你OLEDB源组件内的查询值得做的一百万行这样的事情已经在where子句像

WHERE TableID BETWEEN (SELECT MIN(TableID) FROM Table) + ((? - 1) * 1000000)) 
      AND (SELECT MIN(TableID) FROM Table) + (? * 1000000)) 

有两件事情虽然 - 我想你将不得不在SSIS变量的表达式中构建查询(以前你曾经这么做过吗?它很容易,它有时会在子查询中使用参数给出错误),你应该可以获取MIN(TableID)只是在开始时将其存储在变量中O操作。

难道这一切都值得吗?你认为这会有帮助吗?