2010-04-29 121 views
1

嗨,試圖優化這個查詢解決重複的用戶問題:,Postgres的查詢optmization

SELECT userid, 'ismaster' AS name, 'false' AS propvalue FROM user 
WHERE userid NOT IN (SELECT userid FROM userprop WHERE name = 'ismaster'); 

的問題是,NOT IN後的選擇是120.000記錄,它採取永遠。

使用作爲回報意見建議的解釋前綴:

        QUERY PLAN 

-------------------------------------------------------------------------------- 
-- 
Seq Scan on user (cost=5559.38..122738966.99 rows=61597 width=8) 
    Filter: (NOT (SubPlan 1)) 
    SubPlan 1 
    -> Materialize (cost=5559.38..7248.33 rows=121395 width=8) 
      -> Seq Scan on userprop (cost=0.00..4962.99 rows=121395 width=8 
) 
       Filter: ((name)::text = 'ismaster'::text) 
(6 rows) 

什麼建議嗎?

+1

請問您可以使用psql連接到您的數據庫,然後發出您的查詢,之前解釋(「解釋SELECT userid,...」),然後將輸出添加到您的問題? – 2010-04-29 02:55:45

+0

「優化」在標題中拼寫錯誤。 – bentsai 2010-05-13 18:07:49

回答

0

你把userid的索引?

或嘗試另一種變化:

SELECT userid, 'ismaster' AS name, 'false' AS propvalue FROM user 
WHERE NOT EXISTS 
(SELECT * FROM userprop 
WHERE userpop.userid = user.userid 
    AND name = 'ismaster'); 
+0

Thx!非常快,工作,我想知道爲什麼。 :P – hdx 2010-04-29 07:36:40

0

是名字列索引?名稱的價值有多大? 任何時候,如果有人建議某人對查詢所做的更改提供查詢計劃,即使是看似簡單的查詢。這樣我們才真正知道策劃者正在做什麼。

+0

對不起,這是我第一次聽說有關「查詢計劃」的內容,現在我將詳細瞭解它。感謝教我新東西:P – hdx 2010-04-29 07:11:51

+0

檢查了這本書的初學者 http://www.postgresql.org/docs/8.4/interactive/sql-explain.html – Kuberchaun 2010-04-29 18:14:29

0

根據this answer,使用LEFT JOIN ... IS NULL可能會比NOT EXISTS更快或更慢,這取決於RDBMS,儘管它們在PostGres上是等效的。

SELECT u.userid, 'ismaster' AS name, 'false' AS propvalue FROM user u 
LEFT JOIN userprop up ON u.userid = up.userid AND up.name <> 'ismaster' 
WHERE up.userid IS NULL