代码之家  ›  专栏  ›  技术社区  ›  MLZ

在Postgres中使用子查询重构执行缓慢的查询

  •  0
  • MLZ  · 技术社区  · 7 年前

    我有一个查询执行时间太长(600毫秒)。这主要是因为有了Distinct关键字,如果没有它,它会在大约20毫秒内执行。我试着去掉Distinct并在访问时使用Group By。参与度很高,但我没有看到任何性能改进。以下是原始查询:

    SELECT COUNT(*) FROM "participations" WHERE "participations"."event_id" = $1 AND "participations"."is_preview" = $2 AND ("participations"."id" NOT IN (SELECT DISTINCT "visits"."participation_id" FROM "visits" INNER JOIN "ahoy_events" ON "ahoy_events"."visit_id" = "visits"."id" WHERE "visits"."event_id" = $3 AND "visits"."participation_id" IN (SELECT "participations"."id" FROM "participations" WHERE "participations"."event_id" = $4 AND "participations"."is_preview" = $5))) 
    

    我已经有了访问参与者id和活动id的索引。

    如何将其重构为不使用Distinct操作,或者还能做些什么?在这里使用物化视图有意义吗?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Lukasz Szozda    7 年前

    你可以用它重写 EXISTS :

    SELECT COUNT(*) 
    FROM "participations" p2
    WHERE p2."event_id" = $1 
       AND p2."is_preview" = $2 
       AND NOT EXISTS (SELECT 1
                       FROM "visits" 
                       JOIN "ahoy_events" ON "ahoy_events"."visit_id" = "visits"."id" 
                       JOIN  "participations" ON "visits"."participation_id" = "participations"."id"
                       WHERE "visits"."event_id" = $3 
                         AND "participations"."event_id" = $4  
                         AND "participations"."is_preview" = $5
                         AND p2."participation_id" = "participations"."id"))