I have a table with events with first_seen (datetime), last_seen (datetime) and severity (an integer).
I'm trying to find how many events were active in discreet 15 minute intervals:
WITH intervals AS
(
SELECT
'2016-08-02 00:00:00'::TIMESTAMP
+ (n||' minutes')::INTERVAL AS start_time,
'2016-08-02 00:00:00'::TIMESTAMP
+ ((n + 15)||' minutes')::INTERVAL AS end_time
FROM generate_series(0, 24 * 60, 15) n
)
SELECT
start_time,
(SELECT count(*) FROM event
WHERE first_seen < end_time AND last_seen > start_time
AND severity = 5) red,
(SELECT count(*) FROM event
WHERE first_seen < end_time AND last_seen > start_time
AND severity = 4) orange,
(SELECT count(*) FROM event
WHERE first_seen < end_time AND last_seen > start_time
AND severity = 3) yellow
FROM intervals;
I also have an index on (first_seen, last_seen, severity).
My problem is that it seems to be a be too slow.
The table has about 100 thousand rows, and to make 100 intervals takes 10 seconds. The index scan seems too slow.
Any ideas how to optimize this query?