2013-01-22 40 views
10

从我读到的:SSIS - OLE DB目的地 - 表或视图加载与快速加载

表或视图数据访问模式一次提交每行作为事务。因此,制作一个传输500万行的包需要很长时间(30分钟以上)。

快速加载数据访问模式允许在插入到目标时指定批处理行和提交大小。例如,插入500万条记录需要2分钟以上。

现在问题出现在加载到DW的SSIS包中的一个使用OLE DB目标中的表或视图数据访问模式。根据我的理解,这是为了将它插入的错误行(错误约束)提取到错误记录表中。因此,我们有一个需要30多分钟的过程。反过来,对于同样的动作,快速加载将花费不到2分钟的时间。

如果我理解正确,快速加载将无法区分哪一行导致批处理中的错误,从而导致批处理完全失败?如果是这样,是否有另一种方法来处理这种情况:带有错误行的批次被错误约束重定向,然后以批量好记录发送到正确目标的方式工作到目的地,同时仍然发送错误记录到错误日志表中?甚至这样做是一个好主意吗?对于需要花费的时间来说,咬一口这种子弹是否更好?

预先感谢您。

回答

11

我在这种情况下所做的是一种级联失败的方法。尝试以连续较小的批次插入到OLE DB目标中,尝试在启动单例插入之前获得尽可能多的通过批处理模式。

假设您有10k行的提交大小(任意数字,测试您的情况等)。将失败的行重定向到OLE DB目标,仍处于快速加载模式,但提交大小为2.5k行。添加另一个ole数据库目标,提交大小可能为100,然后最终目标位于RBAR模式。然后,您可以识别失败的行并完成需要完成的任何事情。

+0

我想知道为什么你不做X行的提交,并且如果有错误,不要让组件失败,而是直接将错误行直接重定向到平面文件? - 查看El.HAM的答案 – codeputer

+0

@codeputer我没有让组件失效。我们有相同的答案,只是不同的条款。这个想法是,你试图提交一个大的(高效的)大小,然后削减到较小的部分。削减失败批次的原因是,在那里还有一些好的行,你不想把它们扔掉。您最终指示哪些行(平面文件,表等)基于您的ETL体系结构 – billinkc

+0

我了解有关良好的行,但是如果失败的行已重定向,那么如果没有重定向的行,批处理会失败? – codeputer

2

嗯,我在Fastload模式下使用了一个目的地,并将其错误行重定向到同一个DestinationTable的另一个Destination,但是按Row模式行。

它不像Row by Row那么慢,也不像Fastload那么快,但它对我来说很有用!
此外我有一个错误说明和真正的错误。