我試圖讓查詢得到每年的計數,當年的電影數量已經表明所有人都不是男性(每年,計算的電影數量一年沒有男性)。使用NOT的性能下降
這些都是表:
ACTOR (id, fname, lname, gender)
MOVIE (id, name, year)
CASTS (pid, mid, role) -- pid refers to actor id, mid refers to movie id
這是我索引(id
這些表是主鍵,所以他們已經編入索引,還是讓我假設):
CREATE INDEX gender_index on actor(gender);
CREATE INDEX movie_name_index on movie(name);
CREATE INDEX movie_year_index on movie(year);
CREATE INDEX casts_index on casts(pid, mid, role);
CREATE INDEX casts_pid_index on casts(pid);
CREATE INDEX casts_mid_index on casts(mid);
CREATE INDEX casts_role_index on casts(role);
這是我的查詢:
SELECT m.year, count(m.id)
FROM movie as m
WHERE m.id NOT IN (
SELECT DISTINCT m.id
FROM movie as m, casts as c, actor as a
WHERE m.id = c.mid and a.id = c.pid and a.gender = 'M'
)
GROUP BY m.year
ORDER BY m.year
該查詢需要永遠(並從未完成),所以我怎麼能讓這個快點?是否使用NOT EXISTS
幫助,雖然我認爲優化器處理此問題?我需要索引其他東西嗎?是否有另一個更好的查詢?如果這有什麼不同,我使用PostgreSQL。
這裏是EXPLAIN
:
"GroupAggregate (cost=1512539.61..171886457832.52 rows=61 width=8)"
" Group Key: m.year"
" -> Index Scan using movie_year_index on movie m (cost=1512539.61..171886453988.38 rows=768706 width=8)"
" Filter: (NOT (SubPlan 1))"
" SubPlan 1"
" -> Materialize (cost=1512539.18..1732298.66 rows=1537411 width=4)"
" -> Unique (cost=1512539.18..1718605.60 rows=1537411 width=4)"
" -> Merge Join (cost=1512539.18..1700559.32 rows=7218511 width=4)"
" Merge Cond: (m_1.id = c.mid)"
" -> Index Only Scan using movie_pkey on movie m_1 (cost=0.43..57863.94 rows=1537411 width=4)"
" -> Materialize (cost=1512531.37..1548623.92 rows=7218511 width=4)"
" -> Sort (cost=1512531.37..1530577.65 rows=7218511 width=4)"
" Sort Key: c.mid"
" -> Hash Join (cost=54546.59..492838.95 rows=7218511 width=4)"
" Hash Cond: (c.pid = a.id)"
" -> Seq Scan on casts c (cost=0.00..186246.43 rows=11445843 width=8)"
" -> Hash (cost=35248.91..35248.91 rows=1176214 width=4)"
" -> Seq Scan on actor a (cost=0.00..35248.91 rows=1176214 width=4)"
" Filter: ((gender)::text = 'M'::text)"
什麼是'EXPLAIN'計劃是什麼樣子? – jmelesky
添加了'EXPLAIN'輸出。 – Jack
1)而不是一堆(非唯一)索引:爲表定義一些主鍵和外鍵。在適當的地方使它們不爲NULL。 2)'真空分析'所有涉及的表格。 – joop