Answers:
OLE DB目标组件的数据访问模式有两种形式-快速和非快速。
快速,“表或视图-快速加载”或“表或视图名称变量-快速加载”表示将以基于集合的方式加载数据。
慢-“表或视图”或“表或视图名称变量”将导致SSIS向数据库发出单例插入语句。如果要加载10、100,甚至10000行,则这两种方法之间的性能差异可能很小。但是,在某些时候,您将用所有这些很少的请求使您的SQL Server实例饱和。另外,您将滥用事务日志中的“笨蛋”。
为什么要使用非快速方法?错误的数据。如果我发送了10000行数据,而第9999行的日期为2015-02-29,则将有1万个原子插入和提交/回滚。如果我使用的是Fast方法,那么整批的1万行将全部保存或全部不保存。而且,如果您想知道哪一行出错了,那么最低的粒度级别是1万行。
现在,有一些方法可以尽快加载尽可能多的数据,并且仍然可以处理脏数据。这是一种级联的失败方法,看起来像
这个想法是,您找到了合适的大小,可以一次插入尽可能多的数据,但是如果您收到错误的数据,则将尝试以较小的批次重新保存数据,以到达错误的行。在这里,我以最大插入提交大小(FastLoadMaxInsertCommit)为10000开始。在“错误行”配置上,将其更改为Redirect Row
从Fail Component
。
下一个目标与上述相同,但在这里我尝试进行快速加载并将其分批保存为100行。同样,测试或假装得出合理的大小。这将导致发送100批100行,因为我们知道其中某处至少有一行违反了表的完整性约束。
然后,我向混合物中添加第三个组件,这次我以1的批次保存。或者您可以将表访问模式更改为Fast Load版本,因为它会产生相同的结果。我们将单独保存每一行,这将使我们能够对单个不良行进行“处理”。
最后,我有一个故障保护目的地。可能是与目标位置相同的“表”,但所有列都声明为nvarchar(4000) NULL
。无论该表最终结果是什么,都需要进行研究和清理/丢弃,或者您的不良数据解析过程是什么。其他人则转储到一个平面文件中,但实际上,无论您希望跟踪不良数据的方式是什么,都有意义。
快速加载在快速加载选项下有详细记录
保留导入的数据文件中的标识值,或使用SQL Server分配的唯一值。
在批量加载操作期间,请保留一个空值。
在批量导入操作期间,检查目标表或视图上的约束。
在批量装入操作期间获取表级锁定。指定批处理中的行数和提交大小。
有什么区别; 我唯一可以看出的区别是,快速负载可以更快地传输数据。
在幕后,table or view
将为每行插入单独的SQL命令,而table or view - with fast load
将使用BULK INSERT命令。
如果您看到上述在批量插入中可用的选项,例如number of rows in the batch
= ROWS_PER_BATCH
和 commit 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上 回答了类似的问题。