我有客户和访问表,我想知道这两个查询中哪一个具有更好的性能: 注意:我已经为这些列定义了索引:)
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”
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 毫秒”
正如您在上面的示例中看到的,第二个查询的成本较低,但执行时间比第一个查询长。
我对此很困惑。 我认为这取决于过滤器选项。 您能帮助我理解这一点吗?如果您有更好的疑问,请告诉我。
提前谢谢您
原则上,使用聚合子查询的第一个查询比使用相关子查询的查询要快。这是因为聚合结果集只需评估一次,然后哈希连接到第一个表。
但是查询规划器可能足够聪明,可以以相同的方式处理它们。
visits.customer_id
上的索引会有所帮助。