Производительность запросов к главной таблице с отношением "многие-ко-многим" в 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, те же результаты.

Вернуться на верх