我正在做一个模拟。
在这个模拟中,智能体的移动和移动,以及坐标和时间步长,被记录在sqlite数据库中。
当模拟完成时,我需要显示智能体在某个时间的位置。为此,我使用如下查询
SELECT x,y,z,t from movement where t <= ?1 and id = ?2;我只接受max(t)的记录。这工作得很好,但速度非常慢。
我需要加速它,我想我可以改变数据库的结构。但我不能为每个代理插入位置记录,因为db会增长太多。
与在每个时间步添加代理的“最后有效位置”的记录相同。
那么,我还有其他选择吗?
谢谢
更新:对于这个问题,Movements表只有一堆字段,用于位置(x,y整数)、时间(t整数)和代理的id (整数)。记录数量:时间步数高达50.000,代理可以高达10.000,移动频率可以达到1/10的时间步长。因此,在一个大型模拟中,我们可能有大约5.000个移动,10.000个代理= 5M个移动记录。
发布于 2019-02-26 19:28:41
如果您创建的表是这样的,那么主键在id和t上
CREATE TABLE `Movement` (
`ID` INTEGER,
`T` INTEGER,
`X` INTEGER,
`Y` INTEGER,
`Z` INTEGER,
PRIMARY KEY(`ID`,`T`)
);并像这样查询:
select id,t,x,y,z
from Movement
where id=?2 and t = (select max(t) from Movement where id=?2 and t <= ?1);这会有帮助吗?在这种情况下,不能有任何重复的id /t对。
发布于 2019-02-26 20:28:00
对查询进行如下表述:
select x, y, z, t
from movement
where t <= ?1 and id = ?2
order by t desc
limit 1;您可以在movement(id, t, x, y)上尝试索引以获得更好的性能。
https://stackoverflow.com/questions/54883643
复制相似问题