一、場景介紹
1、需求
根據schema_1中多表聯查結果,對相應schema_2中資料進行刪除操作。
2、表結構
模式表名
表結構schema_1
table_1
id(varchar 32)
pk主鍵
table_2
id(varchar 32)
pk主鍵
table_1_id(varchar 32)
index
table_1表主鍵
table_3
id(varchar 32)
pk主鍵
table_2_id(varchar 32)
index
table_2表主鍵
schema_2
table_3
idpk主鍵
表結構說明:① 從schema_1中三表聯查得到table_3表相應id,根據該結果集對schema_2中table_3資料進行刪除。
② schema_1中table_1、table_2、table_3資料依次增多,且資料量級很大。
③ schema_1中table_3資料為schema_2中table_3資料子集。
二、原始方案及結果
delete
from schema_2.table_3
where "id" in
( select t3."id"
from schema_1.table_3 t3
join schema_1.table_2 t2
on t3.table_2_id = t2."id"
join schema_1.table_1 t1
on t2.table_1_id = t1."id"
where ...
)
該方案子查詢由table_3開始依次聯查table_2、table_1,執行效率極低,分析sql顯示子查詢並未使用到table_3索引。
單獨執行子查詢效率正常,且索引使用正常。
三、優化方案
delete
from schema_2.table_3
where "id" in
( select t3."id"
from schema_1.table_1 t1
join schema_1.table_2 t2
on t2.table_1_id = t1."id"
join schema_1.table_3 t3
on t3.table_2_id = t2."id"
where ...
)
子查詢改為由資料量小的table_1依次聯查至資料量大的table_3,此時執行效率大大降低,分析顯示使用了table_3索引
四、總結
in中子查詢語句如使用聯表查詢,需使用小表驅動大表方式,否則在資料量巨大的場景下,導致大表索引失效,執行效率極低。
記一次sql查詢
效果圖 要查詢出如上圖的效果 知識點.1.多表巢狀查詢.2.輸出查詢結果,group concat函式 3.關聯查詢 select t1.學校,case when t1.年級 2017 then 1年級 when t1.年級 2016 then 2年級 when t1.年級 2015 then 3年...
記一次複雜查詢
專案中有乙個需求,查出使用者取出,充值次數,金額,使用者名稱,金幣的總量和每局遊戲的盈虧等做乙個統計,而他們分布在個表中,分別是使用者表,使用者取出表,使用者充值表,每局遊戲表中。首先想到的就是要分組查詢,group by user.userid.因為有的使用者有充值記錄但不一定有取出記錄,所以需要...
記一次ORACLE查詢更新
結轉專案表.結轉收入 結轉專案表.結轉金額 1 稅率表.稅率 where條件是表名中 表名.id 在查詢結果中存在對應的值才能執行更新語句 update 表名 set 表名.欄位名 select 查詢結果.欄位名 from 查詢語句 查詢結果名 where 表名.id 查詢結果.sys id upd...