在postgres中使用subselect计数真的很慢

时间:2019-05-03 20:06:42

标签: sql postgresql indexing

我有这个查询:

SELECT c.name, COUNT(t.id)
FROM Cinema c 
JOIN CinemaMovie cm ON cm.cinema_id = c.id
JOIN Ticket t ON cm.id = cinema_movie_id
WHERE cm.id IN (
    SELECT cm1.id
    FROM CinemaMovie cm1
    JOIN Movie m1 ON m1.id = cm1.movie_id
    JOIN Ticket t1 ON t1.cinema_movie_id = cm1.id
    WHERE m1.name = 'Hellboy' 
        AND t1.time >= timestamp '2019-04-18 00:00:00'
        AND t1.time <= timestamp '2019-04-18 23:59:59' ) 
GROUP BY c.id; 

问题是当表有2000万行时,该查询的运行速度非常慢(超过1分钟)。据我了解,问题似乎是内部查询,因为它需要很长时间。另外,我在外键上有所有索引。我想念什么?

还请注意,当我仅按名称选择(忽略日期)时,所有操作大约需要10秒钟。

编辑 我想做的是根据电影名称和票证时间戳记每个电影院名称的票证数量。

1 个答案:

答案 0 :(得分:4)

我不明白您为什么使用子查询。这是您想要的吗?

SELECT c.name, COUNT(t.id)
FROM Cinema c JOIN
     CinemaMovie cm
     ON cm.cinema_id = c.id JOIN
     Ticket t
     ON cm.id = cinema_movie_id JOIN
     Movie m
     ON m.id = cm.movie_id
WHERE m.name = 'Hellboy' AND
      t.time >= '2019-04-18'::timestamp and
      t.time < '2019-04-19'::timestamp
GROUP BY c.id, c.name; 
相关问题