【问题标题】:checksum used in merge?合并中使用的校验和?
【发布时间】:2016-10-28 13:41:52
【问题描述】:

我们有一位开发人员去年离开了我们……他是一个很棒的人!作为一名 DBA,我非常喜欢有他加入团队! 但是我从他那里看到了这段代码:

when matched and
                    checksum(TARGET.Lead_ID, TARGET.Salesforce_id)          <> checksum(SOURCE.Lead_ID,SOURCE.Salesforce_id)
            or      checksum(TARGET.Lead_ID, TARGET.CreatedById)            <> checksum(SOURCE.Lead_ID,SOURCE.CreatedById)
            or      checksum(TARGET.Lead_ID, TARGET.Email)                  <> checksum(SOURCE.Lead_ID,SOURCE.Email)
            or      checksum(TARGET.Lead_ID, TARGET.LastModifiedById)       <> checksum(SOURCE.Lead_ID,SOURCE.LastModifiedById)         
            or      checksum(TARGET.Lead_ID, TARGET.ConvertedContactId)     <> checksum(SOURCE.Lead_ID,SOURCE.ConvertedContactId)
            or      checksum(TARGET.Lead_ID, TARGET.ConvertedDate)          <> checksum(SOURCE.Lead_ID,SOURCE.ConvertedDate)
            or      checksum(TARGET.Lead_ID, TARGET.ConvertedOpportunityId) <> checksum(SOURCE.Lead_ID,SOURCE.ConvertedOpportunityId)
            or      TARGET.IsConverted                                      <> SOURCE.IsConverted           
            or      checksum(TARGET.Lead_ID, TARGET.Mini_West_Local_Marketing__c) <> checksum(SOURCE.Lead_ID,SOURCE.Mini_West_Local_Marketing__c)
            or      checksum(TARGET.Lead_ID, TARGET.Valid_Leads__c)         <> checksum(SOURCE.Lead_ID,SOURCE.Valid_Leads__c)
            or      checksum(TARGET.Lead_ID, TARGET.FE_Owner__c)            <> checksum(SOURCE.Lead_ID,SOURCE.FE_Owner__c)
            or      checksum(TARGET.Lead_ID, TARGET.FE_Sales_Group__c)          <> checksum(SOURCE.Lead_ID,SOURCE.FE_Sales_Group__c)

我知道校验和:“返回对表格的一行或表达式列表计算的校验和值。 CHECKSUM 旨在用于构建哈希索引。'。

但是,他为什么要在那里使用它?

注意:(这是代码的一部分,真正的“当匹配”子句有 100 列,源和目标都有 100 列……)

【问题讨论】:

    标签: sql-server merge checksum


    【解决方案1】:

    我的最佳猜测是他试图“快速”检测更改,同时避免NULL 语义。

    不完全确定为什么他在使用 (EXISTS + EXCEPT) 或 (NOT EXISTS + INTERSECT) 时会这样写,但在没有 N 个分支和 N * 2 @987654326 的情况下似乎可以实现相同的结果@操作:

    when matched
     and exists (
             select [SOURCE].[Lead_ID]
                  , [SOURCE].[Salesforce_id]
                  , [SOURCE].[CreatedById]
                  , ...
             except
             select [TARGET].[Lead_ID]
                  , [TARGET].[Salesforce_id]
                  , [TARGET].[CreatedById]
                  , ...
         )
    

    【讨论】:

    • 感谢 Kittoes0124!我认为你是对的,但更重要的是……我们用于合并的 Source 是:“From SourceTable Where UpdateDate > @LastUpdateDate ”……所以不需要做任何检查:如果一条记录被拉出并匹配,它是因为它在源代码中已更新……我会将其更改为“匹配时然后更新”……我可能会遗漏任何潜在问题/警告吗?我将完全依赖在源代码中正确使用 UpdateDate。
    • @Chicago1988 如果您确定不需要执行检查,请不要执行。如果您已经在流程的早期部分花费了 CPU 周期,那么现在浪费 CPU 周期是没有意义的。我只在我不知道传入值是否不同的情况下使用exists/except 模式并且出于某种原因(审计、大小)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多