IF EXISTS(
SELECT TOP 1 1
FROM source a
INNER JOIN target b
ON a.hashValue = b.hashValue
) BEGIN
-- 返回重复记录
SELECT a.*
FROM source a
INNER JOIN target b
ON a.hashValue = b.hashValue
END
ELSE
BEGIN
INSERT INTO Target(filed1, field2, field3, field4 ... hashValue)
SELECT
t.filed1,
t.field2,
t.field3,
t.field4, ..., t.hashValue
FROM target t
END
假定目標表叫做 target(100萬資料), 需要匯入的表叫做 source(10萬資料)。
本例很大的一部分時間消耗在於判斷是否兩張表中的記錄一樣,猜測樓主想要 所有字段都相同(除了id字段)才認定為是同一條記錄。
給每筆記錄計算一個類別Hash值,可以存在target和source新建的欄位中(hashValue), 計算量是 110萬。
然後使用以下語句導入資料
如果考慮事務效率必定不高
個人思路參考下:
1、先判斷要插入的資料是否存在
select id from table where id in('k1,k2,k3');
2、不存在 拼sql 寫入資料庫
10w 資料 拼 1條sql,插入速度 2秒 以內解決
可以看下我之前寫的一篇文章,優化一次插入20w數據3秒內完成
https://my.oschina.net/famous...
我個人的思路是:關鍵點在於判重,建立唯一索引,導入的時候就能保障唯一性了,批量導入可以參照@石頭記的方法。
基於這個問題,後續在導入的時候又出現了比較大問題,數據導入緩慢,因此關於這個,我寫了一篇文章:
/a/11...
希望後續有人看到了之後,能做一定的參考。