sql - SSIS 在更新期间挂起,有 300 万行

标签 sql sql-server tsql stored-procedures ssis

我正在为仓库实现一种新方法。新方法包括在源表和目标表之间执行增量加载(插入、更新或删除)。

所有表都运行良好,除了 1 个表,其中 Source 有超过 300 万行,如下图所示,它只是开始运行但从未结束。 可能我没有以正确的方式进行更新,或者有另一种方式进行更新。

这是我的 SSIS 包的一些图片: ControlFlow

突出显示的对象是它悬挂的地方。 DataFlow 这是我调用来更新表的存储过程:

ALTER PROCEDURE [dbo].[UpdateDim_A] 
      @ID INT,
      @FileDataID INT
     ,@CategoryID SMALLINT
     ,@FirstName VARCHAR(50)
     ,@LastName VARCHAR(50)
     ,@Company VARCHAR(100)
     ,@Email VARCHAR(250) AS BEGIN
SET NOCOUNT ON;


BEGIN TRAN 
 UPDATE DIM_A 
    SET                  
        [FileDataID] = @FileDataID,
        [CategoryID] = @CategoryID,
        [FirstName]  = @FirstName,
        [LastName]   = @LastName,
        [Company]    = @Company,
        [Email]      = @Email

    WHERE PartyID=@ID

    COMMIT TRAN;  END

注意: 我已经尝试删除约束和索引并将数据库的恢复模式更改为简单。

任何帮助将不胜感激。


应用@Prabhat G 提供的解决方案后,这就是我的包的样子,运行时间为 39 秒(平均)!!!

fIXED5

内部 Dim_A 数据流 enter image description here

最佳答案

遵循这 2 个性能增强器,您将避免瓶颈。

  1. 删除排序 转换。在您的源代码中,获取数据时使用 order by sql。 原因是,sort 在排序前占用了内存中的所有记录。您不希望这样,无论是增量加载还是满载。

  2. 在更新的最后一步,引入另一个 Staging Table 而不是 update records oledb 命令,它将成为 Dim 表的副本。一旦所有匹配的记录都插入到这个新的暂存表中,退出数据流任务并创建 EXECUTE SQL TASK,它将根据连接 ID/条件简单地更新 Dim 表。

原因是,oledb 命令逐行命中。始终喜欢使用 Execute SQL Task 作为批处理进行更新。


编辑: 根据评论,要仅更新 Execute SQL Task 中更改的行,请在 where 子句中添加条件:

eg:

UPDATE x
SET
   x.attribute_A = y.attribute_A
  ,x.attribute_B = y.attribute_B
FROM
DimA x
 inner join stg_DimA y
ON x.Id = y.Id
WHERE
(x.Attribute_A <> y.Attribute_A
OR x.Attribute_B <> y.Attribute_B)

关于sql - SSIS 在更新期间挂起,有 300 万行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53601501/

相关文章:

sql-server - 如何在 SQL 中创建 REPLACE PATTERN?

sql-server - CLR 函数调用远程 SQL Server

mysql - SQL - 带 JOIN 的 WHERE 子句

c# - Entity Framework 查询思路(group by)

MySQL查询按条件排序

sql - 我似乎无法在 SQL Server Management Studio 中使用外键或触发器创建看似简单的数据库关系

sql-server - SQL 服务器 : Simulate Long I/O in SQL Server

sql-server - 将逗号分隔的字符串转换为要在 "IN"SQL 中使用的整数

tsql - 舍入到最接近的.25

mysql - 从选择查询结果中插入数据并添加新列