Оптимизировать запрос к Django с помощью Postgres - PullRequest
0 голосов
/ 27 февраля 2019

Я использую Django 2.1 и python 3.6 У меня есть запрос, который содержит другие запросы и, кажется, занимает слишком много времени, чтобы оценить, когда есть много данных для обработки.По сути, он достигает тайм-аута пользователя БД (10 секунд), поэтому запрос не выполняется, и когда я пытаюсь выполнить его без тайм-аута, я получаю следующее сообщение об ошибке из БД (postgres) спустя почти минуту:

ERROR:  canceling statement due to conflict with recovery
DETAIL:  User query might have needed to see row versions that must be removed.

Мойвопрос - как я могу сделать запрос более эффективным?(все используемые поля индексируются в БД)

Это запрос:

migration_set__qs = Migration.objects.filter(
        migration_id=migration_id,
        migration_version=migration_version,
        migration_data__generated_id__isnull=False
    ).values_list(
        'object_id',
        flat=True
    )

containers__qs = Container.objects.all().exclude(
            Q(id__in=migration_set__qs) | Q(created_at__gte=turned_on_date)
        )

limited_containers = containers__qs[0:10]
num_containers_processed += limited_containers.count()

'count ()' запускает оценку запроса, и там он прерывается.

1 Ответ

0 голосов
/ 27 февраля 2019

Первое, что я бы попытался сделать, - это перевести файл mig_set_qs в Подзапрос :

migration_set__qs = Migration.objects.filter(
    migration_id=migration_id,
    migration_version=migration_version,
    migration_data__generated_id__isnull=False
).values(
    'object_id',
)

containers__qs = Container.objects.all().exclude(
    Q(id__in=Subquery(migration_set__qs)) | Q(created_at__gte=turned_on_date)
)

limited_containers = containers__qs[0:10]
num_containers_processed += limited_containers.count()

Хотя я не уверен, решит ли он все ваши проблемы.Пожалуйста, дайте мне знать, если что-то изменится, и если у меня появятся другие идеи, я тоже обновлю этот ответ.

...