2010-06-24 94 views
3

我聽說很多次postgres句柄存在查詢更快然後左加入http://archives.postgresql.org/pgsql-performance/2002-12/msg00185.phpPostgreSQL:存在vs左加入

這是一個匯聚絕對真實。

但在我們的情況下,它們更多的則是同一個查詢建立與存在使Postgres的永遠掛:

explain 
SELECT count(DISTINCT "groups".id) AS count_all 
FROM "groups" 
WHERE (exists(
    select * from products p where groups.id = p.group_id AND exists(
     select * from products_categories pc where p.id = pc.product_id AND pc.category_id in (2,3))) AND groups.id != 3) 

結果:

Aggregate (cost=26413436.66..26413436.67 rows=1 width=4) 
    -> Seq Scan on groups (cost=0.00..26413403.84 rows=13126 width=4) 
     Filter: ((id <> 3) AND (subplan)) 
     SubPlan 
      -> Index Scan using index_products_on_group_id on products p (cost=0.00..1006.13 rows=1 width=1483) 
       Index Cond: ($1 = group_id) 
       Filter: (subplan) 
       SubPlan 
        -> Seq Scan on products_categories pc (cost=0.00..498.49 rows=1 width=8) 
         Filter: ((category_id = ANY ('{2,3}'::integer[])) AND ($0 = product_id)) 

這是根本原因難以置信的長執行時間? 這是一種配置問題嗎?

感謝, 波格丹。

+0

是否有groups.id的索引?因爲對我來說,看起來沒有。另外,你能告訴我們你想要完成什麼嗎?也許我們可以幫助您優化您的查詢。 – EarthMind 2010-06-24 14:39:38

回答

1

那麼,在「組」的每一行,PostgreSQL是做products_categories進行全面掃描,這是不好的。不一定是配置問題,但也許查詢可以說沒有像這樣嵌套子查詢?

SELECT count(DISTINCT "groups".id) AS count_all 
FROM "groups" 
WHERE exists(
    select 1 from products p where groups.id = p.group_id 
      join products_categories pc on pc.product_id = p.id 
    where pc.category_id in (2,3) 
    ) and groups.id <> 3 

也做products_categoriesproduct_id的指數?