Postgresql
我應該怎麼做才能使 not in 更有效率
我在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)