JOIN 的 SSIS 最佳实践

SSIS Best Practices for JOINs

我的任务是将 SQL select 语句转换为 SSIS 包。但是,我不确定应该如何处理 JOINS。是不是最好用Merge/Merge加入?我应该在 OLE DB 连接中简单地使用这个 select 语句吗?我想使用将提供最佳性能的方法。

这是我的 SQL:

SELECT
    AC.Sys_ID,
    AC.Number,
    Approval,
    AC.[Type],
    Category,
    AC.[Configuration item],
    AC.[Short description],
    [Planned start date],
    [Actual start],
    AC.[Planned end date],
    [Actual end],
    AC.[Assignment group],
    AC.[Assigned to],
    AC.Risk,
    [State],
    Closed,
    AC.[Close code],
    ICC.Number,
    ICC.Opened,
    ICC.[Priority],
    ICC.[Short description],
    ICC.Resolved,
    NULL AS DCIO,
    EOMONTH(DATEADD(M,-1,AC.Report_Date)) AS Reporting_Month_End_Date,
    AC.Report_Date,
    AC.Ingestion_Date
FROM
    RAW.SERVICENOW_IMPLEMENTED_CHANGES AS AC    
    LEFT OUTER JOIN (SELECT [Caused by change number], MAX(Opened) AS Max_Opened FROM RAW.SERVICENOW_INCIDENTS_CAUSED_BY_CHANGE GROUP BY [Caused by change number]) AS MICC ON AC.Number = MICC.[Caused by change number]
    LEFT OUTER JOIN RAW.SERVICENOW_INCIDENTS_CAUSED_BY_CHANGE AS ICC ON MICC.[Caused by change number] = ICC.[Caused by change number] AND MICC.Max_Opened = ICC.Opened

SQL 服务器或任何数据库都可以有一个索引,这将提高您匹配数据的能力。 SSIS 没有索引,因此每次您想要连接数据时,您要么必须在源系统中排序,要么在包中排序。 @Piotr 和@ericBrandt 在他们的评论中说的是正确的 - 因为你给出的方向是愚蠢的所以推回去。

就是说,对于这种特定情况,您只是用更改引起的服务现在事件丰富了“服务现在实施的更改”中的现有行。它是连接上的 1 到可选 1(假设我没看错)。

添加一个查找组件,LKP MICC。指定数据来自查询并指定它应忽略错误。

SELECT [Caused by change number], MAX(Opened) AS Max_Opened 
FROM RAW.SERVICENOW_INCIDENTS_CAUSED_BY_CHANGE 
GROUP BY [Caused by change number]

将输入列 [Number] 映射到 [Caused by change number] 并检查 Max_Opened 列以便下游可用

添加第二个查找组件 LKP ICC。指定它也来自查询并指定它应该忽略错误。

SELECT ICC.Number, ICC.Opened, ICC.[Priority], ICC.[Short description], ICC.Resolved
FROM RAW.SERVICENOW_INCIDENTS_CAUSED_BY_CHANGE

将输入列 [Max_Opened] 映射到查找列 [已打开]。检查可用的列。

您应该可以 运行 包裹。当它启动时,它会计算MICC和ICC的所有分组,然后缓存在本地。当行流过时,程序包将检查缓存中是否有匹配的数据。

要在 SSIS 中使用来自任何其他数据库的数据,您可以简单地使用 select 语句,因为 SSIS 没有自己的语法。由于 SSIS 允许开发人员在两种不同的脚本语言之间进行选择:C# 或 Visual Basic(VB) 等。查看您可以在何处进行选择,将脚本任务拖放到控制流设计界面上。