Производительность запросов к главной таблице с отношением "многие-ко-многим" в Django очень медленная в среде staging
У меня есть приложение Django, которое работает с геоданными. Запрос основной таблицы из Djangos ORM, содержащей несколько больших полигонов, в целом работает до смешного медленно, особенно на нашей среде staging.
В настоящее время в таблице ~50k записей. Простой подсчет по ней с одним булевым фильтром занимает (время для ORM взято из Django Debug Toolbar, для сырого SQL я скопировал полученный SQL оттуда же и запустил его в psql shell):
- на моей рабочей машине
- из Django ORM: ~600 мс
- raw SQL: ~60ms
- на нашем промежуточном экземпляре
- из Django ORM: ~12s
- raw SQL: ~80 мс
Что может вызывать такие гигантские накладные расходы? Я считаю, что 10x на моей локальной машине уже тяжеловато, но почти 200x на инстанции staging просто делает приложение бесполезным.
Как Django Debug Toolbar измеряет время выполнения SQL? Я предполагаю, что это может быть какая-то сетевая проблема, поэтому я уже протестировал базу данных, запущенную в docker на staging instance и размещенную на AWS, те же результаты.