使用Postgres优化Django QuerySet查询



我正在使用django 2.1和python 3.6我有一个包含其他查询的查询,似乎花费太长时间了,当有很多数据进行处理时。基本上它可以到达数据库用户超时(10秒),因此查询失败了,当我不超时尝试时,我将在近一分钟后从DB(Postgres)收到以下错误消息:

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

我的问题是 - 如何使查询更有效?(所有使用的字段均在DB中索引)

这是查询:

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()'触发查询的评估,并在那里破裂。

我要尝试的第一件事是将migration_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()

尽管我不确定它是否会解决您的所有问题。如果有任何不同,请让我知道,如果我有其他想法,我也会更新此答案。

最新更新