Что не так с annotate

Перейдите к следующему слайду, нажав кнопку Вправо

Подготовлено онлайн-курсом

https://dvmn.org

Знакомство с Django: ORM

Таблица с постами

id поста Заголовок поста Текст поста
1 Как заработать деньги Нужно много работать...
2 Я заработал много денег Я просто много работал!..
3 Как поверить в себя Работайте над собой...
4 Нужна-ли работа? Определённо нужна...

SQL не может вернуть из БД сразу много лайков для одного поста, поэтому он дублирует каждый пост по количеству лайков.

Запрос с annotate на лайки

id поста Заголовок поста Текст поста Лайк
1 Как заработать деньги Нужно много работать... user id14
1 Как заработать деньги Нужно много работать... user id45
1 Как заработать деньги Нужно много работать... user id67
1 Как заработать деньги Нужно много работать... user id645
... ... ... ...
2 Я заработал много денег Я просто много работал!.. user id24
... ... ... ...

Вызов Count сворачивает эту структуру, оставляя от колонки с лайками только числа — количество лайков. Но промежуточная структура данных всё же создается внутри БД и поглощает море вычислительных ресурсов.

Два annotate порождают неимоверное количество записей для каждого поста: количество лайков умножается на количество постов. Это очень ресурсоёмко.

 

Подсчёт количества лайков вернет неверное число, если забыть добавить distinct=True. Оба annotate вернут число равное количеству лайков умноженному на количество постов.

Запрос с двумя annotate на лайки и комментарии

id поста Заголовок поста Текст поста Лайк Комментарий
1 Как заработать деньги Нужно много работать... user id14 автор id14
1 Как заработать деньги Нужно много работать... user id14 автор id89
1 Как заработать деньги Нужно много работать... user id14 автор id53
... ... ... ...
1 Как заработать деньги Нужно много работать... user id45 автор id831
1 Как заработать деньги Нужно много работать... user id45 автор id39
... ... ... ...

Почему два annotate тормозят

By voron434

Почему два annotate тормозят

Ищем и исправляем ошибки в коде Python

  • 294

More from voron434