python - 使用 Postgres 优化 Django 查询集查询
问题描述
我正在使用 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()' 触发查询的评估并在那里中断。
解决方案
我要尝试的第一件事是将 migration_set_qs 更改为Subquery:
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()
虽然我不确定它是否能解决你所有的问题。如果有任何不同,请告诉我,如果我有任何其他想法,我也会更新这个答案。
推荐阅读
- python - PyCharm:ImportError:libmysqlclient.so.20 仅当我从 IDE 运行 django 应用程序时
- python-3.9 - PLS帮助我是python新手,我不知道问题是什么
- c - 在大多数情况下,当我知道它泄漏了什么时,如何修复该程序的内存泄漏?
- python - python_pygame - FileNotFoundError:没有这样的文件或目录
- reactjs - 如何在 rxjs ajax 中设置查询参数?
- flutter - paginatedDataTable Flutter - DataTableSource 实现
- excel - 真正合并excel表格中的单元格?
- django - 在一个月内为用户分配超过 10 个匹配项时发送邮件
- javascript - 如何通过科尔多瓦设置电子版本
- python - 如何为烧瓶应用程序设置带有文本和图像的 html?