Postgresql

postgresql 使用 ‘where not in’ 子句優化查詢

  • January 24, 2018

我有查詢從 table1 中選擇它們不在 table2 中的所有行,然後將它們插入到 table2 中。由於我在 table2 中有數百萬行,因此該查詢需要花費日誌時間來執行。

是否有更好的方法來優化或重寫此查詢以使其執行得更快。

WITH t1 AS (
select *
from table1
where id  not in (select id table2))
insert into table2
select * from t1 ;

首先你可以嘗試兩件事:


INSERT 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通常是最不利的。

引用自:https://dba.stackexchange.com/questions/196020