Есть ли способ сделать этот аннотационный запрос в django более эффективным?

Я пытаюсь сделать запрос в django более эффективным. Он либо занимает много времени на localhost, либо завершается на моем рабочем сервере, либо просто выдает 500 на крошечном AWS nano сервере, который я использую для тестирования

Что я пытаюсь сделать, это найти наиболее "прокаченные" графики (это случайные таблицы или генераторы случайных чисел), за определенный период времени. Самый большой период времени - 12 месяцев.

Запрос выглядит примерно так...

queryset = Chart.objects.all().filter(diceroll__timestamp__gt=time_delta, diceroll__timestamp__lte=timestamp_now).annotate(num_dicerolls=Count("diceroll")).order_by('-num_dicerolls')

Проблема в том, что чем больше период времени, тем дольше выполняется запрос, поэтому кажется, что огромное количество бросков костей является фактором, способствующим этому. Каждый бросок кубика регистрируется как отдельная запись в таблице DiceRoll (поэтому Chart - это fk в таблице DiceRoll)

Единственная альтернатива, которую я могу придумать, - это решение, не связанное с Django, где совершенно другая таблица базы данных используется для кэширования количества бросков костей для каждого графика за каждый прошедший месяц. Это означало бы, что аннотатору придется меньше считать. Однако это всего лишь предположение, и оно не проверено, поэтому, прежде чем я пойду в эту кроличью нору, я хотел бы знать, нет ли чего-то принципиально неправильного в моем запросе django.

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