我在PostgreSQL 8.4.12下表:PostgreSQL自聯接是否忽略索引?
Table "public.ratings"
Column | Type | Modifiers
--------+------------------------+-----------
userid | character varying(128) |
item | character varying(128) |
score | integer |
Indexes:
"ratings_item" btree (item)
"ratings_ui" btree (userid, item)
"ratings_userid" btree (userid)
我想執行自聯接查找由額定的特定項目的所有用戶評分的項目。爲了簡單起見,我將使用查詢來獲得每個可疑類似項目的評分數量,例如:
select r2.item,sum(1)
from ratings r1
left join ratings r2 using (userid)
where r1.item='an3.php'
group by r2.item
查詢工作正常,但對於我的表有3600萬條記錄,它需要永遠。當我解釋聲明,我得到如下:
GroupAggregate (cost=8102958.42..8247621.18 rows=16978 width=17) -> Sort (cost=8102958.42..8151108.60 rows=19260072 width=17)
Sort Key: r2.item
-> Hash Left Join (cost=1458652.29..4192647.43 rows=19260072 width=17)
Hash Cond: ((r1.userid)::text = (r2.userid)::text)
-> Bitmap Heap Scan on ratings r1 (cost=868.20..77197.24 rows=24509 width
=22)
Recheck Cond: ((item)::text = 'an3.php'::text)
-> Bitmap Index Scan on ratings_item (cost=0.00..862.07 rows=24509 width=0)
Index Cond: ((item)::text = 'an3.php'::text)
-> Hash (cost=711028.93..711028.93 rows=36763293 width=39)
-> Seq Scan on ratings r2 (cost=0.00..711028.93 rows=36763293 width
=39)
從以往的經驗,我相信了「收視率R2序列掃描」是罪魁禍首。
在另一方面,如果我搜索項目不存在:
select r2.item,sum(1) from ratings r1 left join ratings r2 using (userid)
where r1.item='targetitem' group by r2.item;
這似乎做工精細(即不返回任何結果,這是直接的)
GroupAggregate (cost=2235887.19..2248234.70 rows=16978 width=17) -> Sort (cost=2235887.19..2239932.29 rows=1618038 width=17)
Sort Key: r2.item
-> Nested Loop Left Join (cost=0.00..1969469.94 rows=1618038 width=17)
-> Index Scan using ratings_item on ratings r1 (cost=0.00..8317.74 rows=2 059 width=22)
Index Cond: ((item)::text = 'targetitem'::text)
-> Index Scan using ratings_userid on ratings r2 (cost=0.00..947.24 rows= 419 width=39)
Index Cond: ((r1.userid)::text = (r2.userid)::text)
同樣的表和查詢在MySQL中工作正常,但我無法將我的推薦系統遷移到另一個數據庫。
我做錯了什麼,或者這是與Postgres的東西?有沒有解決辦法?
有多少行匹配到an3.php?真空分析是否已經運行?如果有很多行匹配,則索引可能無法使用, –
可能有數百萬個可能的結果。 Mysql能夠在幾秒鐘內爲每個查詢返回一些內容。我將運行真空分析評級並再試一次。 –
vacum分析評分已完成,但仍希望對評分r2進行連續掃描。 –