我有一个简单的时间序列表
movement_history (
data_id serial,
item_id character varying (8),
event_time timestamp without timezone,
location_id character varying (7),
area_id character varying (2)
);
Run Code Online (Sandbox Code Playgroud)
我的前端开发人员告诉我,如果他想知道某个项目在给定时间戳的位置,那么成本太高了,因为他必须对表格进行排序。他希望我为下一个事件添加另一个时间戳字段,这样他就不必进行排序。然而,这将使我插入新动作的代码成本增加一倍以上,因为我需要查询该项目的前一个条目,更新该条目,然后插入新数据。
我的插入当然远远超过他的查询频率。而且我从未见过包含下一个事件时间条目的时间序列表。他告诉我我的表坏了,因为他不频繁的查询需要排序。有什么建议?
我不知道他在使用什么查询,但我会这样做:
select * from movement_history
where event_time <= '1-15-2015'::timestamp
and item_id = 'H665AYG3'
order by event_time desc limit 1;
Run Code Online (Sandbox Code Playgroud)
我们目前有大约 15,000 个项目,它们最多每天输入一次。然而,我们很快就会有 50K 的项目,其传感器数据每 1 到 5 分钟更新一次。
我没有看到他的查询经常执行,但是另一个获取托盘当前状态的查询将会执行。
select distinct on (item_id) *
from movement_history
order by item_id, event_time desc;
Run Code Online (Sandbox Code Playgroud)
该服务器当前运行的是 9.3,但如果需要,它也可以运行在 9.4 上。
postgresql performance partitioning index-tuning postgresql-performance