时间戳与当前时间的部分索引
Partial index on timestamp against current time
我有一个查询,我通过比较五个月前的插入时间戳来过滤行。
此字段不会更新,如果有帮助,我们可能会认为它是不可变的。
CREATE TABLE events (
id serial PRIMARY KEY,
inserted_at timestamp without time zone DEFAULT now() NOT NULL
);
SELECT *
FROM events e
WHERE e.inserted_at >= (now() - '5 minutes'::interval);
和EXPLAIN ANALYZE VERBOSE
:
Seq Scan on public.events e (cost=0.00..459.00 rows=57 width=12) (actual time=0.738..33.127 rows=56 loops=1)
Output: id, inserted_at
Filter: (e.inserted_at >= (now() - '5 minutes'::interval))
Rows Removed by Filter: 19944
Planning time: 0.156 ms
Execution time: 33.180 ms
PostgreSQL好像对字段进行了序列扫描,这就增加了相应的成本。
我是否有机会创建 B 树部分索引或其他任何东西来优化该查询?
最近 5 分钟的部分索引每隔一段时间需要重建。您可以使用 cron 同时构建它(因为您的关系被大量使用),删除旧索引。当然,这种方法可以让您更快地选择最后插入的数据,但考虑到至少每 5 分钟您必须重新扫描一次 table 以构建短的部分索引。
解决方法是数学 - 您可以分阶段拆分索引构建(作为函数):
select now()- inserted_at >= '5 minutes'::interval
from events
where id > (currval('events_id_seq') - 5*(1000000/30))
获取的 id 低于最后 id 值减去最后 5 分钟内插入的近似值。
如果结果为真则在动态查询中使用相同的数学建立索引,如果不是则扩大步骤。
这样您只扫描 PK 以在时间戳上建立索引 - 会便宜得多。
还有一点——如果你应用这样的计算,你可能根本不需要部分索引?..
我有一个查询,我通过比较五个月前的插入时间戳来过滤行。
此字段不会更新,如果有帮助,我们可能会认为它是不可变的。
CREATE TABLE events (
id serial PRIMARY KEY,
inserted_at timestamp without time zone DEFAULT now() NOT NULL
);
SELECT *
FROM events e
WHERE e.inserted_at >= (now() - '5 minutes'::interval);
和EXPLAIN ANALYZE VERBOSE
:
Seq Scan on public.events e (cost=0.00..459.00 rows=57 width=12) (actual time=0.738..33.127 rows=56 loops=1)
Output: id, inserted_at
Filter: (e.inserted_at >= (now() - '5 minutes'::interval))
Rows Removed by Filter: 19944
Planning time: 0.156 ms
Execution time: 33.180 ms
PostgreSQL好像对字段进行了序列扫描,这就增加了相应的成本。
我是否有机会创建 B 树部分索引或其他任何东西来优化该查询?
最近 5 分钟的部分索引每隔一段时间需要重建。您可以使用 cron 同时构建它(因为您的关系被大量使用),删除旧索引。当然,这种方法可以让您更快地选择最后插入的数据,但考虑到至少每 5 分钟您必须重新扫描一次 table 以构建短的部分索引。
解决方法是数学 - 您可以分阶段拆分索引构建(作为函数):
select now()- inserted_at >= '5 minutes'::interval
from events
where id > (currval('events_id_seq') - 5*(1000000/30))
获取的 id 低于最后 id 值减去最后 5 分钟内插入的近似值。
如果结果为真则在动态查询中使用相同的数学建立索引,如果不是则扩大步骤。
这样您只扫描 PK 以在时间戳上建立索引 - 会便宜得多。
还有一点——如果你应用这样的计算,你可能根本不需要部分索引?..