Медленный запрос к полям index_together в Django - PullRequest
0 голосов
/ 19 января 2020

У меня есть команда управления загрузкой входных данных контроллера в Django 2.2.3 с PostgreSQL сервером 10.7. После профилирования я обнаружил, что из 5 секунд времени выполнения примера данных в сумме после 1750 итераций 3 секунды тратятся на existing_variable_value = VariableValue.objects.get(variable_id=variable.id, record_id=record.id) исходную строку. Это действительно плохо и странно.

В подклассе VariableValue модель Meta есть оператор index_together = unique_together = ['record', 'variable'] (оба являются внешними ключами). Если я выполняю explain analyze select * from analytics_variablevalue where record_id = '1' and variable_id = '2'; в консоли PSQL, я вижу Index Scan, то есть используется индекс. Также PSQL показывает execution time: 0.063 ms, если я умножу его на 1750 значений переменных в исходном файле данных, это будет 110 мс, что намного меньше, чем 3 секунды, которые я получаю в Django коде.

Может Кто-нибудь помочь мне объяснить такое поведение и оптимизировать мой код?

1 Ответ

1 голос
/ 19 января 2020

Это, вероятно, вызвано задержкой между вашим клиентом и вашей базой данных. Даже в 2 мс в оба конца время выполнения запросов увеличивается до 17 с на 1750 вызовов.

Возможно, вам придется пакетировать ваши запросы. Может быть с Django in_bulk или чем-то подобным.


Даже при локальном соединении задержка запроса значительна.

$ psql 
psql (11.5)
Type "help" for help.

tometzky=> \timing on
Timing is on.
tometzky=> select 1;
Time: 0.931 ms
tometzky=> select 1;
Time: 0.461 ms
tometzky=> select 1;
Time: 0.494 ms
tometzky=> select 1;
Time: 0.462 ms
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...