我正在使用OLE Db目标批量导入多个平面文件。经过一些调整后,我最终得到的SQL Server目标速度提高了25-50%。
虽然我对这个目的地感到困惑,因为网上有相互矛盾的信息,有些人反对,有些人建议使用它。我想知道,在将其部署到生产环境之前是否有任何严重的陷阱?感谢
答案 0 :(得分:4)
在这个答案中,我将尝试从SSIS的官方文档中提供信息,我将提到我对SQL Server目标的个人经验。
根据official SQL Server Destination documentation:
SQL Server目标连接到本地SQL Server数据库,并将数据批量加载到SQL Server表和视图中。您不能在访问远程服务器上的SQL Server数据库的程序包中使用SQL Server目标。相反,软件包应使用OLE DB目标。
SQL Server目标提供与批量插入任务提供的SQL Server相同的高速数据插入;但是,通过使用SQL Server目标,包可以在将数据加载到SQL Server之前将转换应用于列数据。
要将数据加载到SQL Server,您应该考虑使用SQL Server目标而不是OLE DB目标
根据official OLEDB Destination documentation:
OLEDB目标 - 快速加载选项:将数据加载到OLE DB目标中的表或视图中,并使用快速加载选项,这些选项针对批量插入进行了优化
根据SQL Server Destination Vs OLE DB Destination - MSDN topic:
前整合服务集团项目经理Donald Farmer表示,使用SQL Server Destination
可以使性能提升5到10%。
此外,请参阅Microsoft的数据集成专家Matt Masson的以下帖子,他回答了以下问题:
我应该使用SQL Server目的地吗?
答案是
否强>
...
我的建议是,如果您需要每一点性能(10小时加载时10%的性能提升可能很大),请尝试使用SQL Server目标来查看它是如何工作的。但是 - 请记住SQL Server目标的以下限制:
- 您必须在与目标数据库相同的计算机上运行SSIS
- 您必须以管理员身份运行该程序包
- 出现问题时很难调试
鉴于这些限制,我建议使用OLE DB目标,即使您看到SQL Server目标的性能提升。
(更新@ 2019-03-25)
在搜索SSIS最佳实践时,我发现了一个非常有用的Microsoft artcile,可以作为参考:
在本文中,他们对所有数据加载方法(包括SQL Server目标和OLEDB目标)进行了比较,他们提到:
SQL Server目标 SQL Server目标是将数据从Integration Services数据流批量加载到SQL Server的最快方法。此目标支持SQL Server的所有批量加载选项 - ROWS_PER_BATCH除外。
请注意,此目标需要与SQL Server的共享内存连接。这意味着它只能在Integration Services与SQL Server在同一物理计算机上运行时使用。
OLE DB目标: OLE DB目标支持SQL Server的所有批量加载选项。但是,为了支持有序的批量加载,需要一些额外的配置。有关更多信息,请参阅“排序输入数据”。要使用批量API,您必须为“快速加载”配置此目标。
OLE DB目标可以使用与SQL Server的TCP / IP和命名管道连接。这意味着OLE DB目标与SQL Server目标不同,可以在批量装入目标以外的计算机上运行。由于使用OLE DB目标的Integration Services包不需要在SQL Server计算机本身上运行,因此可以使用主力服务器扩展ETL流。
(更新@ 2019-03-25)
由于此问题被许多人用作参考,并且在此域中更有经验之后,我添加了此部分以提及我使用SQL Server目标的个人体验。
虽然官方文档提到SQL Server目标会提高性能,但由于很多原因,我根本不建议使用这些组件:
您还可以参考以下帖子(来自@billinkc)以获取有关此主题的更多信息:
根据Microsoft的文章,您可以说SQL Server Destination
提高了插入数据(它使用BULK insert)的性能,但它是针对特定情况设计的,即本地SQL服务器。 OLEDB Destination
更通用,在其他情况下推荐使用Fast Load
数据访问模式(它也使用BULK插入) OLE DB destination
它会增加数据加载的性能。
另一方面,根据我的经验以及SSIS专家撰写的许多文章,根本不推荐使用SQL Server目的地,因为它不稳定且经常抛出异常并且表现可以被认为是微不足道的。
答案 1 :(得分:1)
要增加Hadi的好答案,请不要使用SQL Server目的地。
根据我的经验,性能优势不会超过必须在与目标数据库相同的计算机上执行包的限制。它强制建立一个可能适用于您的处理架构,也可能不适合您今天或一年之后。这对我的口味来说太不灵活了。
我提倡避免使用SQL Server目标的另一个更大的原因是我经历过的平局。相同的平面文件到一个空的表 - 第1轮,它中止了一个模糊的错误消息(不能回忆特定的)出错的地方。立即重启包,它按预期工作。 也许你,最卑微的读者,可以接受处理时间的再处理时间,但对我而言,自2008年以来它不值得。