PostgreSQL 更好的查询性能

问题描述 投票:0回答:1

我有客户和访问表,我想知道这两个查询中哪一个具有更好的性能: 注意:我已经为这些列定义了索引:)

查询1

SELECT
  customers.id as id,
  COALESCE(v.count, 0) as visits

FROM
  customers
  LEFT OUTER JOIN (
    SELECT customer_id, count(*)
    FROM visits
    GROUP BY customer_id
  ) as v on visits.customer_id = customers.id

解释分析结果:

“散列左连接(成本=2565.84..2947.00行=13001宽度=12)(实际时间=53.467..64.636行=13011循环=1)”

“执行时间:71.433 ms”

查询2

SELECT
  customers.id as id,
  (
      SELECT count(*)
        FROM service_visits
        WHERE
        service_visits.customer_id=customers.id
  ) as visits

FROM
  customers

解释分析结果:

“仅对客户使用customers_pkey进行索引扫描(成本=0.29..208310.43行=13001宽度=12)(实际时间=5.618..195.558行=13011循环=1)”

“执行时间:206.584 毫秒”

正如您在上面的示例中看到的,第二个查询的成本较低,但执行时间比第一个查询长。

我对此很困惑。 我认为这取决于过滤器选项。 您能帮助我理解这一点吗?如果您有更好的疑问,请告诉我。

提前谢谢您

postgresql performance query-optimization
1个回答
0
投票

原则上,使用聚合子查询的第一个查询比使用相关子查询的查询要快。这是因为聚合结果集只需评估一次,然后哈希连接到第一个表。

但是查询规划器可能足够聪明,可以以相同的方式处理它们。

visits.customer_id
上的索引会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.