Postgresql
postgresql 使用 ‘where not in’ 子句優化查詢
我有查詢從 table1 中選擇它們不在 table2 中的所有行,然後將它們插入到 table2 中。由於我在 table2 中有數百萬行,因此該查詢需要花費日誌時間來執行。
是否有更好的方法來優化或重寫此查詢以使其執行得更快。
WITH t1 AS ( select * from table1 where id not in (select id table2)) insert into table2 select * from t1 ;
首先你可以嘗試兩件事:
- 不要使用 WITH 因為它是一個優化柵欄。從 PostgreSQL 10 開始,CTE 查詢的結果將實現,即使最好不要實現。
- 使用
NOT EXISTS
而不是NOT IN
. 關於為什麼在 stackoverflow 上的詳細解釋:https ://stackoverflow.com/questions/173041/not-in-vs-not-existsINSERT INTO table2 SELECT * FROM table1 WHERE NOT EXISTS (SELECT 1 FROM table2 WHERE table2.id=table1.id);
另外,請研究並分享查詢的解釋或可能的解釋分析的結果。
假設在(通常是)上有一個
UNIQUE
索引,UPSERT 應該是最簡單的 - 如果您插入大部分行,則速度最快:id``PRIMARY KEY
INSERT INTO table2 SELECT * FROM t1 ON CONFLICT DO NOTHING;
否則,有幾種技術(
NOT EXISTS
例如@Daniel 展示是不錯的選擇之一):
NOT IN
通常是最不利的。