Как сделать запрос, чтобы получить последний элемент каждой группы в Django ORM? - PullRequest
0 голосов
/ 01 ноября 2018

В моей базе данных Postgresql есть своего рода таблица грузовиков. Я пишу новые данные каждую минуту. И я хочу получить последний элемент каждой группы по серийному. Но проблема в том, что моя база данных настолько огромна, что выполнение запросов занимает много времени. Теперь у меня 470000 строк данных. Я попытался сделать запрос:

rec_ = Trucks.objects.filter(serial='tsr1801').distinct('serial').order_by('serial', '-id')

Он реагирует так медленно. И я попробовал другие методы, показанные ниже, но эти запросы также работают медленно.

1) https://stackoverflow.com/a/19930802/7456750

Шахта: Trucks.objects.annotate(max_id=Max('id')).filter(id=F('max_id'))

2) https://stackoverflow.com/a/17887296/7456750

Шахта: Trucks.objects.values('serial', 'payload', 'datetime').annotate(id=Max('id'))

Есть ли способ получить последний элемент каждой группы, который работает быстро?

+-----+-------------+------------+---------------------+
|  Id |   Serial    |  Payload   |     Datetime        |
+-----+-------------+------------+---------------------+
|  1  |   tsr1801   |   24432    | 2018-11-01 12:00:00 |
+-----+-------------+------------+---------------------+
|  2  |   tsr1802   |   20234    | 2018-11-01 12:01:00 |
+-----+-------------+------------+---------------------+
|  3  |   tsr1802   |   21234    | 2018-11-01 12:01:00 |
+-----+-------------+------------+---------------------+
|  4  |   tsr1801   |   24332    | 2018-11-01 12:02:00 |
+-----+-------------+------------+---------------------+
|  5  |   tsr1801   |   21532    | 2018-11-01 12:03:00 |
+-----+-------------+------------+---------------------+
|  6  |   tsr1802   |   19234    | 2018-11-01 12:02:00 |
+-----+-------------+------------+---------------------+
|  7  |   tsr1801   |   18040    | 2018-11-01 12:04:00 |
+-----+-------------+------------+---------------------+
|  9  |   tsr1801   |   27452    | 2018-11-01 12:05:00 |
+-----+-------------+------------+---------------------+

1 Ответ

0 голосов
/ 01 ноября 2018

Я думаю, вы можете использовать последний здесь. Например:

 Trucks.objects.filter(serial='tsr1801').latest('Datetime')  # as per table

Обновление

Решения, которым вы следовали, уже очень хорошие. Даже если вы используете следующий запрос (например, тот, который вы используете):

 Truck.objects.distinct('serial').order_by('serial', '-Datetime')

Должно быть достаточно быстро.

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

...