SSIS数据流数据访问模式-“表或视图”与快速加载的意义何在?


9

使用SQL Server商业智能开发工作室,我做了很多平面文件到OLE DB目标数据流,以将数据导入到我的SQL Server表中。在OLE DB目标编辑器中的“数据访问模式”下,它默认为“表或视图”,而不是“表或视图-快速加载”。有什么区别; 我唯一可以看出的区别是,快速负载可以更快地传输数据。

Answers:


13

OLE DB目标组件的数据访问模式有两种形式-快速和非快速。

快速,“表或视图-快速加载”或“表或视图名称变量-快速加载”表示将以基于集合的方式加载数据。

慢-“表或视图”或“表或视图名称变量”将导致SSIS向数据库发出单例插入语句。如果要加载10、100,甚至10000行,则这两种方法之间的性能差异可能很小。但是,在某些时候,您将用所有这些很少的请求使您的SQL Server实例饱和。另外,您将滥用事务日志中的“笨蛋”。

为什么要使用非快速方法?错误的数据。如果我发送了10000行数据,而第9999行的日期为2015-02-29,则将有1万个原子插入和提交/回滚。如果我使用的是Fast方法,那么整批的1万行将全部保存或全部不保存。而且,如果您想知道哪一行出错了,那么最低的粒度级别是1万行。

现在,有一些方法可以尽快加载尽可能多的数据,并且仍然可以处理脏数据。这是一种级联的失败方法,看起来像

级联故障插入

这个想法是,您找到了合适的大小,可以一次插入尽可能多的数据,但是如果您收到错误的数据,则将尝试以较小的批次重新保存数据,以到达错误的行。在这里,我以最大插入提交大小(FastLoadMaxInsertCommit)为10000开始。在“错误行”配置上,将其更改为Redirect RowFail Component

下一个目标与上述相同,但在这里我尝试进行快速加载并将其分批保存为100行。同样,测试或假装得出合理的大小。这将导致发送100批100行,因为我们知道其中某处至少有一行违反了表的完整性约束。

然后,我向混合物中添加第三个组件,这次我以1的批次保存。或者您可以将表访问模式更改为Fast Load版本,因为它会产生相同的结果。我们将单独保存每一行,这将使我们能够对单个不良行进行“处理”。

最后,我有一个故障保护目的地。可能是与目标位置相同的“表”,但所有列都声明为nvarchar(4000) NULL。无论该表最终结果是什么,都需要进行研究和清理/丢弃,或者您的不良数据解析过程是什么。其他人则转储到一个平面文件中,但实际上,无论您希望跟踪不良数据的方式是什么,都有意义。


5

快速加载在快速加载选项下有详细记录

  • 保留导入的数据文件中的标识值,或使用SQL Server分配的唯一值。

  • 在批量加载操作期间,请保留一个空值。

  • 在批量导入操作期间,检查目标表或视图上的约束。

  • 在批量装入操作期间获取表级锁定。指定批处理中的行数和提交大小。


有什么区别; 我唯一可以看出的区别是,快速负载可以更快地传输数据。

在幕后,table or view将为每行插入单独的SQL命令,而table or view - with fast load将使用BULK INSERT命令。

如果您看到上述在批量插入中可用的选项,例如number of rows in the batch= ROWS_PER_BATCHcommit size=BATCHSIZE

另一种情况是

默认的最大插入提交大小(2147483647)太高。因此,例如,您要插入500K行,并且由于PK违反而导致批处理失败。在这种情况下,当您使用FAST LOAD选项时,整个批处理将失败。您也将无法获得错误描述。

您可以在此处table or view将目标错误输出。因此,在500K中,您将FAST LOAD用作5K插入提交大小的开始。如果该批处理中的1行失败,则将那些5K批处理重定向到table or view加载-仅对5K行使用逐行插入,并且您也可以将错误重定向table or view到一个平面文件..以便如果任何行都使批处理失败如果是5K,您将能够查明导致故障的原因。

上述方法的优点是,如果所有行均未失败,则它将对整个批处理使用BULK INSERT(快速加载)。

SSIS爱好者Billinkc在Stackoverflow上 回答了类似的问题

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.