【问题标题】:Postgres query optmizationPostgres 查询优化
【发布时间】:2011-02-13 14:48:11
【问题描述】:

大家好,尝试优化此查询以解决重复用户问题:

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 条记录,而且它需要永远。

使用 cmets 中建议的解释前缀返回:

                                    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)

有什么建议吗?

【问题讨论】:

  • 能否请您使用 psql 连接到您的数据库,然后发出您的查询,前面加上 explain ("explain SELECT userid,..."),然后将输出添加到您的问题中?
  • “优化”在标题中拼写错误。

标签: sql optimization postgresql query-optimization


【解决方案1】:

你是否在用户 ID 上设置了索引?

或尝试其他变体:

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

【讨论】:

    【解决方案2】:

    名称列是否已编入索引?名称值的选择性如何? 此外,只要您想让某人推荐对查询的更改,就可以提供查询计划,即使是看似简单的查询。这样我们才能真正知道规划者在做什么。

    【讨论】:

    【解决方案3】:

    根据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
    

    【讨论】:

      猜你喜欢
      • 2022-01-24
      • 1970-01-01
      • 1970-01-01
      • 2015-09-13
      • 2021-08-31
      • 2017-12-25
      • 2021-05-04
      • 1970-01-01
      相关资源
      最近更新 更多