具體需求
資料庫裡存在100萬個資料;
要導入10萬個資料;
如果要匯入的資料在資料表裡存在,則終止資料導入;
疑問
如何在每個資料需要對比的情況下快速導入,同時導入失敗進行資料回滾?
phpcn_u15822017-05-16 13:11:47
假定目標表叫做 target(100萬資料), 需要匯入的表叫做 source(10萬資料)。
本例很大的一部分時間消耗在於判斷是否兩張表中的記錄一樣,猜測樓主想要 所有字段都相同(除了id字段)才認定為是同一條記錄。
給每筆記錄計算一個類別Hash值,可以存在target和source新建的欄位中(hashValue), 計算量是 110萬。
然後使用以下語句導入資料
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
我想大声告诉你2017-05-16 13:11:47
如果考慮事務效率必定不高
個人思路參考下:
1、先判斷要插入的資料是否存在
select id from table where id in('k1,k2,k3');
2、不存在 拼sql 寫入資料庫
10w 資料 拼 1條sql,插入速度 2秒 以內解決
可以看下我之前寫的一篇文章,優化一次插入20w數據3秒內完成
https://my.oschina.net/famous...
怪我咯2017-05-16 13:11:47
基於這個問題,後續在導入的時候又出現了比較大問題,數據導入緩慢,因此關於這個,我寫了一篇文章:
/a/11...
希望後續有人看到了之後,能做一定的參考。