【问题标题】:SSIS data transfer slows down after inserting few million rows插入几百万行后,SSIS 数据传输速度变慢
【发布时间】:2017-03-22 19:08:26
【问题描述】:

我遇到了这个奇怪的问题,非常感谢任何帮助。

我有一个容器,其中我的 SSIS 包中有 2 个数据流任务,数据传输非常庞大。问题分解。

  • First Container 正在从 oracle 向 SQL 传输大约 1.3 亿行,它运行良好并且在大约 40 到 60 分钟内传输行,这是非常可接受的。
  • 现在是第二部分的另一个数据流任务,它仅将大约 8600 万行从 SQL 服务器传输到 SQL 服务器(一个表),数据传输飞得非常快,直到 6070 百万,然后它就消失了或者像其他 1000 万行一样爬行需要 15 个小时,我无法理解为什么会这样?
  • 表被截断,然后被加载,我尝试增加 DataBuffer 属性等但无济于事。

提前感谢您的帮助。

【问题讨论】:

    标签: sql-server oracle ssis


    【解决方案1】:

    您正在创建单个事务并且事务日志正在填满。如果一次移动 10000 行,您可以获得 10-100 倍的速度。您也可以尝试将最大插入提交大小设置为 0 或尝试 5000 并向上查看对性能的影响。这是在 OLE DB 目标组件上。以我的经验,10000 行是当前的神奇数字,这似乎是最佳点,但当然它在很大程度上取决于行的大小、SQL Server 的版本和硬件设置。

    您还应该查看目标表上是否有索引,您可以尝试删除索引、加载表并重新创建索引。

    【讨论】:

    • 谢谢!将尝试这些建议,并让您知道您能否建议如何检查事务日志是否已填满?我的目标表只有一个非聚集索引将尝试禁用它并重建它以查看是否有帮助并将最大插入提交大小设置为 0
    • 尝试将最大插入提交大小更改为 10000,看看会发生什么。
    • 如果您运行的是 2012 及更高版本,您可以查看:SELECT DB_NAME(database_id) AS DatabaseName , database_id , CAST(( total_log_size_in_bytes / 1048576.0 ) AS DECIMAL(10, 1)) AS TotalLogSizeMB , CAST( ( used_log_space_in_bytes / 1048576.0 ) AS DECIMAL(10, 1)) AS LogSpaceUsedMB , CAST(used_log_space_in_percent AS DECIMAL(10, 1)) AS LogSpaceUsedPercent FROM sys.dm_db_log_space_usage;
    • Making Maximum insert Commit Size 0 提高了包的性能,但在 Microsoft 网站中提到这不是一个好习惯,我必须运行包是否有缺点每天都有客户敏感数据,任何失败都会导致巨大的问题。
    • 如果步骤失败(不管最大插入提交大小是多少),您将不得不重新运行包。尝试不同的值,看看它如何影响执行时间。根据 MS docs.microsoft.com/en-us/sql/integration-services/data-flow/… '0 值表示在处理完所有行后,所有数据都在一个批次中提交。'
    【解决方案2】:

    您的目标恢复模式是什么?完整/简单等...

    源和目标之间是否有任何转换?尝试将源发送到 RowCount 以确定源可以发送数据的最大速度。您也可能会看到源端的放缓。

    一旦您注意到速度变慢,行的内容有什么不同吗?例如,最近的行可能在 varchar(max) 列中有很多早期的行没有使用的文本。

    您的目标是否在虚拟机上运行?如果是,您是否预先分配了 CPU 和 RAM? SSIS 是多线程的,但它不一定会使用 100% 的每个内核。 VM 主机可能与其他 VM 共享资源,因为 SSIS VM 未报告所有资源的全部使用情况。

    【讨论】:

    • 一旦你注意到速度变慢,行的内容有什么不同吗?例如,最近的行可能在 varchar(max) 列中有很多早期的行没有使用的文本。不,行的内容没有差异,最近的行没有很多 varchar 等
    • 您的目标是否在 VM 上运行?如果是,您是否预先分配了 CPU 和 RAM? SSIS 是多线程的,但它不一定会使用 100% 的每个内核。 VM 主机可能与其他 VM 共享资源,因为 SSIS VM 没有报告所有资源的完全使用情况——我不知道如何检查 SSIS 包是否在哪个 VM 上运行并确定 CPU 和 RAM 使用情况任何建议这将非常有帮助。我可以登录到目标表等的 SQL 服务器
    • 感谢您的建议 您的目标恢复模式是什么? Full/Simple 等... 完全恢复模式 源和目标之间是否有任何转换?尝试将源发送到 RowCount 以确定源可以发送数据的最大速度。您也可能会看到源端的放缓。没有转换简单的数据传输,已尝试行计数,建议没有瓶颈。
    猜你喜欢
    • 2014-09-18
    • 2023-01-31
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    • 2017-06-18
    • 2018-07-11
    相关资源
    最近更新 更多