2016-09-23 4 views
0

私はこのレガシーコードを持っている...マージ:マージを削除/挿入に置き換えると問題が発生しますか?

MERGE [Salesforce_Lead] AS target 
using  ( 
        SELECT lead_id, 
          salesforce_id, 
          createdbyid, 
          email, 
          updatedate 
        FROM Source.Leads) AS source 
ON ( 
          target.lead_id = source.lead_id) 
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.updatedate) <> Checksum(source.lead_id,source.updatedate) 


THEN 

UPDATE 
SET    target.salesforce_id = source.salesforce_id, 
       target.createdbyid = source.createdbyid, 
       target.email = source.email, 
       target.updatedate = source.updatedate, 


when not matched BY target THEN 
INSERT 
     ( 
       lead_id, 
       salesforce_id, 
       createdbyid, 
       email, 
       updatedate, 
     ) 
     VALUES 
     ( 
       source.lead_id, 
       source.salesforce_id, 
       source.createdbyid, 
       source.email, 
       source.updatedate 
     ) 

そして、私は以下のコードのためにそれを変更したい:

DELETE FROM [dbo].[Salesforce_Lead] 
FROM [dbo].[Salesforce_Lead] AS L 
     INNER JOIN Source.Leads AS t 
       ON L.lead_id = t.lead_id; 


INSERT INTO [dbo].[lead] 
SELECT * 
FROM Source.Leads 

理由: -shorterコード、保守が容易。 - ソースからも削除する場合、またはOUTPUT句を使用している場合、MERGEが使用されるはずです... - 多くの更新はありませんが、通常はプレーンな挿入です。

何か不足していますか?私がマッチを使うべき唯一の理由は、 "合ったとき"に得られるパフォーマンスですが、私が言ったように、ほとんどはインサートです。マージを削除/挿入すると問題はありますか?

答えて

2

マージステートメントを使用して、初期読み込みとインクリメンタル読み込みの両方を実装できます。しかし、プレーン・インサートを使用したい場合は、挿入操作を行っても難しい場合があります。インクリメンタルロードを実行するたびに、ターゲットテーブルを最初に切り捨ててから、ロードをやり直したいのですか?

もう1つの問題は、タイプ2のSCDとして実装しようとすると、プレーンな挿入と更新のステートメントが非常に複雑で面倒ですが、マージステートメントは非常に効率的で高速です。