By using db<>fiddle, you agree to license everything you submit by Creative Commons CC0.
Help with an interesting Postgres question: Why isn't an Index Only Scan used on a partition accessed via the parent table?.
CREATE TABLE
INSERT 0 9
setseed |
---|
SELECT 1
INSERT 0 420000
id | start_time | end_time |
---|---|---|
109 | 2024-02-13 19:11:16.932586 | 2024-02-13 23:21:19.459637 |
532 | 2023-08-14 03:29:31.850986 | 2023-08-14 23:02:38.318462 |
764 | 2024-02-16 18:59:49.274986 | 2024-02-17 09:49:41.507871 |
1120 | 2023-12-08 15:34:15.934186 | 2023-12-09 10:11:29.016729 |
1823 | 2024-01-03 02:28:05.681386 | 2024-01-03 22:33:53.993674 |
1833 | 2023-07-25 03:03:21.185386 | 2023-07-25 16:19:16.143746 |
2367 | 2023-04-26 18:20:07.054186 | 2023-04-27 03:11:52.386872 |
2832 | 2023-03-06 08:20:54.631786 | 2023-03-07 04:33:21.163002 |
3069 | 2024-01-13 05:51:23.892586 | 2024-01-13 11:23:46.139657 |
3085 | 2023-09-21 04:22:12.103786 | 2023-09-21 07:38:05.960571 |
4479 | 2023-03-29 21:26:04.145386 | 2023-03-30 03:28:54.530147 |
4537 | 2023-11-19 11:33:02.551786 | 2023-11-20 07:43:05.853259 |
4596 | 2024-01-29 11:18:14.791786 | 2024-01-29 16:19:13.644006 |
4639 | 2023-11-09 07:07:09.396586 | 2023-11-09 22:58:39.120375 |
SELECT 14
CREATE INDEX
VACUUM
PREPARE
QUERY PLAN |
---|
Bitmap Heap Scan on public.time_interval (cost=43.54..1940.71 rows=936 width=20) (actual time=0.527..1.289 rows=901 loops=1) |
Output: id, start_time, end_time |
Recheck Cond: (tsrange(COALESCE(time_interval.start_time, 'infinity'::timestamp without time zone), COALESCE(time_interval.end_time, 'infinity'::timestamp without time zone)) && '["2024-02-10 10:00:00","2024-02-10 17:00:00"]'::tsrange) |
Heap Blocks: exact=765 |
-> Bitmap Index Scan on gist_idx (cost=0.00..43.30 rows=936 width=0) (actual time=0.434..0.434 rows=901 loops=1) |
Index Cond: (tsrange(COALESCE(time_interval.start_time, 'infinity'::timestamp without time zone), COALESCE(time_interval.end_time, 'infinity'::timestamp without time zone)) && '["2024-02-10 10:00:00","2024-02-10 17:00:00"]'::tsrange) |
Planning Time: 0.245 ms |
Execution Time: 1.356 ms |
EXPLAIN
PREPARE
QUERY PLAN |
---|
Seq Scan on public.time_interval (cost=0.00..8976.14 rows=15455 width=20) (actual time=0.007..35.399 rows=901 loops=1) |
Output: id, start_time, end_time |
Filter: (((time_interval.start_time <= '2024-02-10 17:00:00'::timestamp without time zone) OR (time_interval.start_time IS NULL)) AND (('2024-02-10 10:00:00'::timestamp without time zone <= time_interval.end_time) OR (time_interval.end_time IS NULL))) |
Rows Removed by Filter: 419108 |
Planning Time: 0.082 ms |
Execution Time: 35.446 ms |
EXPLAIN