У меня есть команда управления загрузкой входных данных контроллера в 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 коде.
Может Кто-нибудь помочь мне объяснить такое поведение и оптимизировать мой код?