記一次postgresql查詢優化

2021-10-08 07:12:29 字數 1507 閱讀 8294

一、場景介紹

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...