Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Postgres优化Django查询集查询_Python_Django_Postgresql_Django Queryset - Fatal编程技术网

Python 使用Postgres优化Django查询集查询

Python 使用Postgres优化Django查询集查询,python,django,postgresql,django-queryset,Python,Django,Postgresql,Django Queryset,我正在使用Django 2.1和python 3.6 我有一个包含其他查询的查询,当有大量数据要处理时,它的计算时间似乎太长。 基本上,它达到了db用户超时(10秒),因此查询失败,当我在没有超时的情况下尝试时,我在将近一分钟后从db(postgres)收到以下错误消息: ERROR: canceling statement due to conflict with recovery DETAIL: User query might have needed to see row versio

我正在使用Django 2.1和python 3.6 我有一个包含其他查询的查询,当有大量数据要处理时,它的计算时间似乎太长。 基本上,它达到了db用户超时(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()”触发对查询的求值,然后查询中断。

我要尝试的第一件事是将迁移集更改为:


虽然我不确定它是否能解决你所有的问题。如果有任何不同,请告诉我,如果我有任何其他想法,我也会更新此答案。

我将尝试的第一件事是将迁移集更改为:


虽然我不确定它是否能解决你所有的问题。如果有任何不同,请告诉我,如果我有任何其他想法,我也会更新此答案。

您的
对象id
是外键吗?您知道迁移集返回的ID的大概数量吗?@mfrackowiak-它不是外键。您的
object\u id
外键是多少?您知道迁移集返回的ID的大概数量吗?@mfrackowiak-它不是外键。大约122kThanks@mfrackowiak。但结果是一样的。无论如何,它都会创建子查询。谢谢@mfrackowiak。但结果是一样的。它无论如何都会创建子查询。
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()