引:
我們在做數據庫開發用 pl sql 加工數據時,經常會遇到取a表不在b表中的記錄 或者 左表不在右表中的記錄 的情況,所以特地對此做個簡單的總結,以便以後用到回顧。
解決:
取a表某字段不在b表 我們自然的邏輯會想到用 a not in b ,這是第一種方法
1 not in
如下圖 ,數據庫爲不跑業務的測試數據庫,兩張表的數據量一樣, 用not in 可以找出a表中prd_inst_id不在t表中的記錄
如下圖,爲生產庫的表 l 和t表數據量相同,數據量900w左右
2 not exsits
1) 如下圖,用的 not exists 找出 a表prd_inst_id 不在b表的記錄
2)
select ssss1.*
from odso.tb_b_ft_broadband_l ssss1
where not exists (select 1
from tb_b_ft_broadband b
where ssss1.prd_inst_id = b.prd_inst_id); --2min 30s
3 left join or right join 特別注意 一般不會想到這個
如下圖:先用a表 左關聯b表 取到a表所有記錄的結果集 ,再限制 b.latn_id is null (假設b 本身記錄latn_id沒有是空的) 實際上應該用b.prd_inst_id is null (關聯字段)
即可得到 b表中沒有a表prd_inst_id的那些記錄,即a表不在b表的記錄
上面的所有情況都是a表不在b表的記錄佔 總記錄數據是很少的情況,幾百萬分之一
從效率上看,測試庫的 not in 比 not exsits 在20w及的數據量下 快,差距雖然2倍,但是時間相差不大。
生產庫的not exists 比 not in快很多 兩分鐘,所以關於 not in 及not exists 哪個更快的問題 要看具體情況及執行計劃,參考:
oracle開發系列(三)exists¬ exists用法及與in¬ in比較(10g)
再看left join 時間花了 10分鐘,比 not in 及exists 滿了 好幾倍,
但是在db2裏面 一般 找數據量大的不存在於 一般都用left join 關聯字段爲分佈鍵,會很快。