小编Dmi*_*tro的帖子

如何获得 OR'ed 时间范围谓词的索引扫描?

我有events包含字段的表:

id
user_id
time_start
time_end
...
Run Code Online (Sandbox Code Playgroud)

并在 上有 B 树索引(time_start, time_end)

SELECT user_id
FROM events
WHERE ((time_start <= '2021-08-24T15:30:00+00:00' AND time_end >= '2021-08-24T15:30:00+00:00') OR
       (time_start <= '2021-08-24T15:59:00+00:00' AND time_end >= '2021-08-24T15:59:00+00:00'))
GROUP BY user_id);
Run Code Online (Sandbox Code Playgroud)
Group  (cost=243735.42..243998.32 rows=1103 width=4) (actual time=186.533..188.244 rows=166 loops=1)
  Group Key: user_id
  Buffers: shared hit=224848
  ->  Gather Merge  (cost=243735.42..243992.80 rows=2206 width=4) (actual time=186.532..188.199 rows=176 loops=1)
        Workers Planned: 2
        Workers Launched: 2
        Buffers: shared hit=224848
        ->  Sort  (cost=242735.39..242738.15 rows=1103 width=4) (actual time=184.121..184.126 rows=59 loops=3) …
Run Code Online (Sandbox Code Playgroud)

postgresql index range-types query-performance postgresql-performance

4
推荐指数
1
解决办法
328
查看次数