2010-04-29 81 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