Postgresql

我應該怎麼做才能使 not in 更有效率

  • July 27, 2022

我在PostgreSQL中有兩個表article和article_content,表article_content中的article_id是文章表id。現在sql看起來像這樣:

select * 
from article_content ac 
where article_id not in(
  select id from article a 
)
limit 10

在 article_content 中查找文章中不存在的記錄。這是簡單的查詢:

Limit  (cost=1000.00..44996.68 rows=1 width=415)
 ->  Gather  (cost=1000.00..38955542254.16 rows=885420 width=415)
       Workers Planned: 2
       ->  Parallel Seq Scan on article_content ac  (cost=0.00..38955452712.16 rows=368925 width=415)
             Filter: (NOT (SubPlan 1))
             SubPlan 1
               ->  Materialize  (cost=0.00..101153.51 rows=1775167 width=8)
                     ->  Seq Scan on article a  (cost=0.00..85342.67 rows=1775167 width=8)

現在表 article 和 article_content 有這麼多行。似乎這個 sql 無法永遠完成。我應該怎麼做才能刪除文章中不存在的文章內容行?

通常 NOT EXISTS 更有效:

select ac.* 
from article_content ac 
where not exists (select *
                 from article a 
                 where a.id = ac.article_id)
limit 10;

一個索引article_content (article_id)將提高性能。我假設已經有一個索引article (id)

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