使用 SQL Server Business Intelligence Development Studio,我对 OLE DB 目标数据流执行了大量平面文件,以将数据导入到我的 SQL Server 表中。在 OLE DB 目标编辑器中的“数据访问模式”下,它默认为“表或视图”而不是“表或视图 - 快速加载”。有什么不同; 我能感觉到的唯一明显区别是快速加载传输数据的速度要快得多。
bil*_*nkc 14
OLE DB 目标组件的数据访问模式有两种风格 - 快速和非快速。
快速,“表或视图 - 快速加载”或“表或视图名称变量 - 快速加载”意味着数据将以基于集合的方式加载。
慢 - “表或视图”或“表或视图名称变量”将导致 SSIS 向数据库发出单例插入语句。如果您要加载 10、100,甚至 10000 行,则两种方法之间的性能差异可能很小。但是,在某些时候,您将使用所有这些微不足道的小请求使 SQL Server 实例饱和。此外,您将滥用事务日志。
为什么你会想要非快速方法?糟糕的数据。如果我发送了 10000 行数据并且第 9999 行的日期为 2015-02-29,那么您将有 10k 原子插入和提交/回滚。如果我使用的是 Fast 方法,那么整批 10k 行要么全部保存,要么不保存。如果您想知道哪一行出错了,您将拥有的最低粒度级别是 10k 行。
现在,有一些方法可以尽可能快地加载尽可能多的数据,同时仍然处理脏数据。这是一个级联失败的方法,它看起来像
这个想法是你找到合适的大小在一次拍摄中尽可能多地插入,但如果你得到错误的数据,你将尝试以连续较小的批次重新保存数据以获取错误的行。在这里,我从 10000 的最大插入提交大小 (FastLoadMaxInsertCommit) 开始。在错误行处置中,我将其Redirect Row从Fail Component.
下一个目的地与上面相同,但在这里我尝试快速加载并以 100 行为一组进行保存。再次测试或假装提出合理的尺寸。这将导致发送 100 批 100 行,因为我们知道在那里的某个地方,至少有一行违反了表的完整性约束。
然后我将第三个组件添加到组合中,这次我以 1 个为一组进行保存。或者您可以将表访问模式从快速加载版本中更改,因为它会产生相同的结果。我们将单独保存每一行,这将使我们能够对单个坏行做“某事”。
最后,我有一个故障安全目的地。也许它与预期目标是“相同”的表,但所有列都声明为nvarchar(4000) NULL. 无论最终出现在该表上的任何内容都需要进行研究和清理/丢弃,或者无论您的不良数据解析过程是什么。其他人转储到平面文件,但实际上,无论您想如何跟踪不良数据都有意义。
快速加载在FAST LOAD 选项下有详细记录
保留导入数据文件中的标识值或使用 SQL Server 分配的唯一值。
在批量加载操作期间保留空值。
在大容量导入操作期间检查目标表或视图上的约束。
在批量加载操作期间获取表级锁。指定批处理中的行数和提交大小。
有什么不同; 我能感觉到的唯一明显区别是快速加载传输数据的速度要快得多。
在幕后,table or view将对每一行使用单独的 SQL 命令来插入 vstable or view - with fast load将使用 BULK INSERT 命令。
如果您看到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 上 回答了一个类似的问题。