В приложении Django у меня есть набор компаний с историей действий, которые были выполнены в прошлом. Я получить эти операции со следующим, возмутительно дорогой QuerySet:Как оптимизировать этот конкретный Queryset?
class Company(AbstractBaseUser, PermissionsMixin):
...
def get_transactions_history(self):
return Transaction.objects.filter(sponsorship__campaign__shop__company=self)
Очевидно, что это приводит к большому количеству JOIN
инструкций от ОРМА и поскольку число Transactions
может быстро увеличиваться, пропускная способность на дб также взрывается из-за этого Queryset.
Если предположить, что нет ярлыка между Transaction
и Company
, кроме цепочки через Sponsorship
, Campaign
и Shop
как открытой выше, как бы вы оптимизировать QuerySet, не касаясь в схеме базы данных?
Если конечный результат транзакции - отношения компании - это как «сквозная», использование «триггера» для создания теневой копии только «transaction_id» и «company_id» всякий раз, когда создается транзакция, кажется логичным для меня. – Anzel
. вещь, близкая к оптимизации, будет 'shop__company_id = self.id', но я не думаю, что это помогло бы многим – Sayse
@Sayse, как бы' company_id = self.id' улучшило производительность? Это потому, что сравнение двух целых чисел быстрее, чем сравнение двух объектов? – Buddyshot