Правильный способ ускорить конкретный запрос sqlite - PullRequest
0 голосов
/ 26 февраля 2019

Я работаю над симуляцией.

В этой симуляции движения агентов и движение с координатами и временным шагом записываются в базу данных sqlite.

Когда симуляция завершенаМне нужно отобразить положение агентов в определенное время.Для этого я использую запрос типа

SELECT x,y,z,t from movement where t <= ?1 and id = ?2;

и беру только запись с max(t).Это работает нормально, но очень медленно.

Мне нужно ускорить его, и я подумал, что могу изменить структуру базы данных.Но я не могу вставить запись позиции для каждого агента, потому что БД будет слишком сильно расти.

То же самое для добавления записи "последней действительной позиции" агентов на каждом временном шаге.

Итак, какие у меня есть другие варианты?

Спасибо

ОБНОВЛЕНИЕ: Что касается проблемы, то в таблице Movements есть только несколько полей для позиции (x,y INTEGERS) время (t INTEGER) и идентификатор агента (целое число).Количество записей: количество шагов составляет до 50 000, количество агентов может достигать 10 000, а перемещение может происходить с частотой 1/10.Таким образом, в большой симуляции у нас может быть около 5000 движений для 10.000 агентов = 5 миллионов записей для движений.

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Сформулируйте запрос следующим образом:

select x, y, z, t
from movement
where t <= ?1 and id = ?2
order by t desc
limit 1;

Вы можете попробовать индекс на movement(id, t, x, y) для повышения производительности.

0 голосов
/ 26 февраля 2019

Если вы создали таблицу таким образом, с первичным ключом на 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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...