【问题标题】:SQL Server Destination vs OLE DB DestinationSQL Server 目标与 OLE DB 目标
【发布时间】:2017-11-20 09:40:08
【问题描述】:

我使用 OLE Db 目标来批量导入多个平面文件。经过一些调整后,我最终将 SQL Server Destination 提高了 25 - 50 %。

虽然我对这个目的地感到困惑,因为网上有相互矛盾的信息,有些人反对,有些人建议使用它。我想知道,在将其部署到生产环境之前是否有任何严重的陷阱?谢谢

【问题讨论】:

  • 什么信息是矛盾的? SQL Server 目标的缺点是包必须在您要插入的 SQL Server 上运行。因此,如果您要在与您插入的服务器不同的服务器上运行软件包,请不要使用它。我认为这些信息很清楚。
  • 除了灵活性的降低之外,SQL Server 目标中的错误消息可能更加隐秘,因此有些人建议不要使用它。例如(马特应该知道)mattmasson.com/2012/06/should-i-use-the-sql-server-destination
  • 我的意思是矛盾的,因为有些人建议在 SQL Server 目标上使用 OLE DB。如果限制只是:使用共享内存,没有错误输出,我可以忍受。我只是想避免将来可能出现的问题
  • @JankaP 如果您要求其他人分享他们的意见,我认为这是一个基于意见的问题。或者您必须搜索 SSIS 提供者的意见以获得公正的答案。我认为提供的答案符合这个要求

标签: sql-server ssis oledb etl bulkinsert


【解决方案1】:

在这个答案中,我将尝试提供来自 SSIS 官方文档的信息,并提及我对 SQL Server 目标的个人经验。

1。 SQL Server 目标

根据official SQL Server Destination documentation

SQL Server 目标连接到本地 SQL Server 数据库并将数据批量加载到 SQL Server 表和视图中。您不能在访问远程服务器上的 SQL Server 数据库的包中使用 SQL Server 目标。相反,包应该使用 OLE DB 目标。

SQL Server 目标提供与 Bulk Insert 任务提供的相同的高速数据插入 SQL Server;但是,通过使用 SQL Server 目标,包可以在将数据加载到 SQL Server 之前对列数据应用转换。

要将数据加载到 SQL Server,您应该考虑使用 SQL Server 目标而不是 OLE DB 目标

2。 OLEDB 目的地

根据official OLEDB Destination documentation

OLEDB 目标 - 快速加载选项:将数据加载到 OLE DB 目标中的表或视图中,并使用快速加载选项,该选项针对批量插入进行了优化

3。 OLEDB 目标与 SQL Server 目标

根据SQL Server Destination Vs OLE DB Destination - MSDN topic

前集成服务集团项目经理Donald Farmer 表示,使用SQL Server Destination 可以将性能提高5% 到10%。

另外,参考微软数据集成专家Matt Masson的以下帖子,他回答了以下问题:

我应该使用 SQL Server 目标吗?

答案是

...

我的建议是,如果您需要所有性能(在 10 小时负载下性能提高 10% 可能很重要),请尝试 SQL Server 目标,看看它如何为您工作。但是 – 请记住 SQL Server 目标的以下限制:

  • 您必须让 SSIS 与目标数据库在同一台机器上运行
  • 您必须以管理员身份运行包
  • 出错时很难调试

鉴于这些限制,我建议使用 OLE DB 目标,即使您发现 SQL Server 目标的性能有所提高。

3.1。数据加载性能指南

(更新@2019-03-25)

在搜索 SSIS 最佳实践时,我发现了一个非常有用的 Microsoft 文章,可以用作参考:

在这篇文章中,他们对包括 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 目标可以使用 TCP/IP 和命名管道连接到 SQL Server。这意味着与 SQL Server 目标不同,OLE DB 目标可以在除大容量加载目标之外的计算机上运行。由于使用 OLE DB 目标的 Integration Services 包不需要在 SQL Server 计算机本身上运行,因此您可以使用主力服务器横向扩展 ETL 流。

3.2。个人经历

(更新@2019-03-25)

由于这个问题被很多人用作参考,并且在这个领域更有经验之后,我添加了这个部分来提及我使用 SQL Server 目标的个人经验。

虽然官方文档提到 SQL Server 目标会提高性能,但由于多种原因,我完全不建议使用此组件:

  1. 要求目标服务器和 ETL 服务器相同(仅适用于本地 SQL 服务器)
  2. 总是抛出没有任何意义的异常
  3. 在对海量数据进行测试后,与 OLEDB 目标的性能差异可以忽略不计(在分块加载约 500 GB 数据上进行测试,时间差异小于一分钟)

您还可以参考以下帖子(来自@billinkc),以获取有关此主题的更多信息:


4。结论

根据微软的文章,你可以说SQL Server Destination 提高了插入数据的性能(它使用 BULK 插入),但它是针对本地 SQL 服务器的特定情况而设计的。 OLEDB Destination 更通用,建议在其他情况下使用 Fast Load 数据访问模式(也使用 BULK 插入) OLE DB destination 将提高数据加载的性能。

另一方面,根据我的经验和 SSIS 专家撰写的许多文章,完全不建议使用 SQL Server Destination,因为它不稳定并且经常抛出异常和性能可以忽略不计。


其他信息

最近,我发表了一篇关于这个主题的详细文章。您可以在以下位置查看:

【讨论】:

  • 需要考虑的一点是,OLE DB connectionSQL Server Destination 更广泛,并且更容易找到它的相关主题
【解决方案2】:

要增强 Hadi 的最佳答案,请不要使用 SQL Server Destination。

根据我的经验,性能优势不会超过必须在与目标数据库相同的机器上执行包的限制。它强制采用一种处理架构,该架构可能适合您,也可能不适合您今天或一年后的情况。这对我的口味来说太不灵活了。

我提倡避免使用 SQL Server 目标的另一个更重要的原因是我在使用它时遇到的明显错误。与空表相同的平面文件 - 第 1 轮,它以模糊的错误消息(无法回忆具体)中止,表明出现问题。立即重新启动包,它按预期工作。 也许你,最谦虚的读者,可以接受处理时间与再处理时间的权衡,但对我来说,自 2008 年以来,这并不值得。

【讨论】:

  • 我完全同意你的看法,当我写答案时,我试图仅提及官方文档中的信息。但是根据我的个人经验,我完全不推荐使用 SQL Server Destination,因为它总是抛出没有任何意义的异常并且它有很多限制。我更新了我的答案以提及这一点并添加更多官方信息。此外,我在 dba.stackexchange 上添加了您的一个惊人答案作为参考。
猜你喜欢
  • 1970-01-01
  • 2016-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-25
  • 1970-01-01
相关资源
最近更新 更多