postgres in查詢優化


項目場景:

從kafka消費N條數據,每條帶有一個id,從表A中查出這N個id對應的N條記錄,繼續做其他業務

翻譯:select * from A where id in("1","2","3","4","5",..............)

這里的id是一個字符串,非數值型,N是一個可配的(比如我們一般是2000-4000),表示一次從kafka消費的條數

表A數據量:5000萬以內

數據庫:postgres 9.6

初期:直接暴力執行select * from A where id in("1","2","3","4","5",..............)查出結果,因為考慮到性能,N只給500-1000條

然而查詢很慢,嚴重影響后續整個的速度

修改一:將N個id的查詢改為200個一批查一次,每次的結果拼接后組成N條記錄

修改二:將N個id的查詢改為200個一批,開10個線程查詢,最后結果合並

這樣的查詢,速度也可以接受,但是總感覺應該還有別的方式處理in操作

於是找到了regexp_split_to_table這個函數:

SELECT * from regexp_split_to_table('111,222,333,444',',') t left JOIN A on A.id = t;

該函數將一個list轉化成一張臨時表(案列中的in的條件),與將要查詢的表做聯表查詢,左表的量相當於in條件的id個數

項目中大表量最大為8000萬,

sql實例:

select f.* from (select regexp_split_to_table(#{picIds},',')as id) as t, dw_face_feature f where t.id = f.human_pic_id 
有興趣的伙伴可以放入項目中一試~~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM