8

我是 SSIS 新手,有两个问题

  1. 我想将 1,25,000 行从一个表传输到同一个数据库中的另一个表。但是当我使用Data Flow Task时,它花费了太多时间。我尝试使用 anADO NET Destination和 an,OLE DB Destination但性能无法接受。当我在其中编写等效查询时,Execute SQL Task它提供了可接受的性能。为什么会出现这样的性能差异。

    INSERT INTO table1 从 table2 中选择 *

  2. 根据第一次观察,我改变了我的包裹。它完全由Execute SQL Tasks直接查询或存储过程组成。如果我可以仅Execute SQL Task使用 . 我已经看到它可靠,易于维护且相对较快。

4

2 回答 2

28

性能差异

有很多事情可能会导致“直接”数据流任务和等效的执行 SQL 任务的性能。

  1. 网络延迟。您正在同一服务器和实例上从表 b 插入表 a。在执行 SQL 任务中,该工作将完全在同一台机器上执行。我可以在服务器 B 上运行一个包,该包从服务器 A 查询 125 万行,然后这些行将通过网络流式传输到服务器 B。然后,该数据将被流式传输服务器 A 以进行相应的 INSERT 操作。如果你的网络很差,数据很宽——尤其是二进制类型,或者服务器之间的距离很远(服务器 A 在美国,服务器 B 在印度),性能就会很差
  2. 内存不足。假设包在与目标/源数据库相同的服务器上执行,它仍然可能很慢,因为数据流任务是一个内存引擎。这意味着,将从源流向目标的所有数据都将进入内存。SSIS 可以获得的内存越多,运行速度就越快。但是,它将不得不与操作系统争夺内存分配以及 SQL Server 本身。即使 SSIS 是 SQL Server 集成服务,它也不会在与 SQL Server 数据库相同的内存空间中运行。如果你的服务器分配了 10GB 内存,而操作系统使用 2GB,而 SQL Server 声称有 8GB,那么 SSIS 运行的空间很小。它不能要求 SQL Server 放弃其部分内存,因此操作系统将不得不在数据流通过受限数据管道时进行分页。
  3. 粗制滥造的目的地。根据您使用的 SSIS 版本,OLE DB 目标的默认访问模式是“表或视图”。这是一个很好的设置,可以尝试防止低级锁升级为表锁。但是,这会通过痛苦的行插入(发送 125 万个唯一插入语句)导致行。Execute SQL Task将其与s INSERT INTO的基于集合的方法进行对比。较新版本的 SSIS 将访问方法默认为目标的“快速”版本。这将更像基于集合的等效项,并产生更好的性能。
  4. OLE DB 命令转换。有一个OLE DB 目标,有些人将其与OLE DB 命令转换混淆。这是两个具有不同用途的非常不同的组件。前者是目的地并消耗所有数据。它可以非常快。后者始终是RBAR。它将对流经它的每一行执行单例操作。
  5. 调试。在 BIDS/SSDT 中运行包存在开销。该包执行被包装在 DTS 调试主机中。这可能会导致包执行的“不显着”减慢。调试器对执行 SQL 任务无能为力——它运行或不运行。一个数据流,它可以检查、监视大量内存等,这会减少可用内存量(参见第 2 部分),并且由于它正在执行的各种检查而减慢它的速度。要获得更准确的比较,请始终从命令行 (dtexec.exe /file MyPackage.dtsx) 运行包或从 SQL Server 代理计划它。

包装设计

只是Execute SQL Tasks 的 SSIS 包本质上没有任何问题。如果问题很容易通过运行查询来解决,那么我会完全放弃 SSIS 并编写适当的存储过程并使用 SQL 代理安排它并完成。

也许。即使对于像这样的“简单”案例,我仍然喜欢使用 SSIS 的原因是它可以确保一致的可交付成果。这听起来可能不多,但从维护的角度来看,很高兴知道一切与数据混淆的内容包含在这些源代码控制的 SSIS 包中。我不必记住或培训新人任务 AC 是“简单的”,因此它们是从 SQL 代理作业调用的存储过程。Tasks DJ,或者它是 K,甚至比这更简单,所以它只是代理作业中的“在线”查询来加载数据,然后我们为其余的东西准备了包。除了 Service Broker 和一些 Web 服务之外,它们也会更新数据库。我年纪越大,接触的地方越多,我就越能在一致的(即使是矫枉过正的)解决方案交付方法中找到价值。

性能并不是一切,但 SSIS 团队确实使用 SSIS 设置了 ETL 基准,因此它绝对有能力快速推送一些数据。

随着这个答案越来越长,我只是将其保留为 SSIS 的优势和直接 TSQL 上的数据流是本机的,开箱即用

  • 日志记录
  • 错误处理
  • 配置
  • 并行化

为了我的钱很难打败那些。

于 2013-04-24T02:32:39.577 回答
-1

如果您在参数映射选项卡中将 SSIS 变量作为参数传递并通过表达式将值分配给这些变量,那么您的执行 SQL 任务会在评估该表达式时消耗大量时间。使用表达式任务(单独)分配变量,而不是在变量选项卡中使用表达式。

于 2018-09-13T05:35:51.613 回答