2016-10-07 5 views
0

"Campaign"というフィールドを持つテーブル(200K行)があります。私は追加の情報とキャンペーンの別のテーブルのリストを持っています。 where (campaign_id = campaign) OR (cid.spend_source = a.Traffic_Source AND a.Campaign = cid.Campaign_Name)に参加したいです。OR非効率でクエリを左に結合

私が直面している問題は、OR文が4億行のネストループを引き起こして効率が低下していることです。

もっと良い方法はありますか?

UPDATE a 
SET a.campaign_name = cid.Campaign_Name, 
     a.Campaign_ID = cid.Campaign_ID 
FROM database.dbo.table a 
     LEFT JOIN carb.dbo.carb_lookup_campaignid cid 
       ON cid.Campaign_ID = a.Campaign 
        OR (cid.spend_source = a.Traffic_Source 
         AND a.Campaign = cid.Campaign_Name) 
+2

を更新分離を2つ使用

MERGE INTO a USING (SELECT * FROM a LEFT OUTER JOIN carb_lookup_campaignid cid ON (ON cid.Campaign_ID = a.Campaign) OR (cid.spend_source = a.Traffic_Source AND a.Campaign = cid.Campaign_Name) ) WHEN MATCHED THEN UPDATE SET a.campaign_name = cid.Campaign_Name, a.Campaign_ID = cid.Campaign_ID 
scaisEdge

+1

パフォーマンス質問には、 'EXPLAIN ANALYZE'とテーブルサイズ、インデックス、現在の時間パフォーマンス、欲求時間などの情報が含まれています。'スロー 'は相対的な用語であり、比較のためには本当の値が必要です。 –

+1

これは非標準SQLです。どのDBMSを使用していますか? –

答えて

1

二つの別々のleft join秒でください:

UPDATE a 
    SET a.campaign_name = coalesce(cidss.Campaign_Name, cidlc.Campaign_Name), 
     a.Campaign_ID = coalesce(cidss.Campaign_ID, cidlc.Campaign_ID) 
    FROM database.dbo.table a LEFT JOIN 
     carb.dbo.carb_lookup_campaignid cidss 
     ON cidss.Campaign_ID = a.Campaign and 
      cidss.spend_source = a.Traffic_Source LEFT JOIN 
     carb.dbo.carb_lookup_campaignid cidlc 
     ON cidlc.Campaign_ID = a.Campaign and 
      cidlc.Campaign_Name = a.Campaign and 
      cidss.Campaign_ID is null 
    WHERE cidss.Campaign_ID is not null or cidls.Campaign_ID is not null; 

個々LEFT JOINは、適切なインデックス(Campaign_ID, spend_source)(Campaign_ID, Campaign_Name)を利用することができます。

1


こんにちは、
別のテーブルから更新している間に、必ずMERGEステートメントを使用>あなたは

UPDATE a 
    SET a.campaign_name = cid.Campaign_Name, 
     a.Campaign_ID = cid.Campaign_ID 
    FROM database.dbo.table a 
    LEFT JOIN carb.dbo.carb_lookup_campaignid cid    
      ON cid.Campaign_ID = a.Campaign 
    ; 

UPDATE a 
    SET a.campaign_name = cid.Campaign_Name, 
     a.Campaign_ID = cid.Campaign_ID 
    FROM database.dbo.table a 
    LEFT JOIN carb.dbo.carb_lookup_campaignid cid    
       ON (cid.spend_source = a.Traffic_Source 
        AND a.Campaign = cid.Campaign_Name) 
    ; 
+0

私はMERGEを使ったことが一度もありませんでした。 –

1

クエリの下に使用することができます2つの別々のアップデートを使用する..
関連する問題