Слишком длинный select при использовании полей JSON
Есть две связанные модели
from django.contrib.postgres.indexes import GinIndex
from django.db import models
class Model(models.Model):
name = models.CharField(max_length=128, db_index=True)
attributes = models.JSONField(null=True)
class Meta:
db_table = 'models'
indexes = [GinIndex(fields=['attributes'])]
class Offer(models.Model):
price = models.DecimalField(decimal_places=2, max_digits=8, db_index=True)
quantity = models.SmallIntegerField()
model = models.ForeignKey('Model', related_name='offers', on_delete=models.CASCADE)
class Meta:
db_table = 'offers'
indexes = [GinIndex(fields=['attributes'])]
Когда я делаю запросы, используя несколько атрибутов предложения, это занимает много времени. Что не так с этим кодом? У меня в базе данных около 5000 моделей и около 300 000 предложений. Запрос занимает около 20 секунд. Если я использую только один атрибут из предложения, все нормально.
result = (
Model.objects
.prefetch_related('offers')
.filter(attributes__param1='value1')
.filter(attributes__param2=False)
.filter(offers__attributes__width='255')
.filter(offers__attributes__height='55')
.filter(offers__attributes__diameter='16')
)