gpt4 book ai didi

django - Django 1.11.8 中的子查询非常慢 - 我可以加快速度吗?

转载 作者:行者123 更新时间:2023-11-29 14:33:39 24 4
gpt4 key购买 nike

我有一些表在两个单独的 Django 模型中没有通过 FK 关系连接,并且我正在尝试执行 SubQuery。数据如下所示:

# "master" data table - reflects real property ownership by humans
# there are often changes to property ownership
class OwnershipRecord(Model):
parcel = CharField(max_length=10, unique=True)
owner_name = ...
other data fields ...

# Poor man's 'elastic search' or an index of sorts for OwnershipRecord
class Lead(Model):
ownership_record = OneToOneField(OwnershipRecord)
preforeclosure = BooleanField(default=False)
aggregated data/booleans/etc...

# "descriptor" table for a property
# there are not often changes to a property's physical traits
ResidentialMasterRecord(Model):
parcel = CharField(max_length=10, unique=True) # These are the SAME as OwnershipRecord
livablesqft = ...
lotsqft = ...

因此,我正在研究一个可以按平方英尺过滤 Lead 对象的查询。 LeadOwnershipRecord 相关,但与 ResidentialMasterRecord 没有关系 - 它作为“事实表”存在,类似于集合坐标将针对特定地址。

我认为 SubQuery 在这种情况下可以工作,我可以从 OwnershipRecordResidentialMasterRecord 引用 parcel code> 将两者实时链接。

极其慢。这是我正在尝试的查询:

from django.db.models import OuterRef, SubQuery
from myapp.models import OwnershipRecord, Lead, ResidentialMasterRecord

RMR_SQ = ResidentialMasterRecord.objects \
.filter(parcel=OuterRef("ownership_record__parcel"))
qs = Lead.objects.select_related('ownership_record') \
.annotate(sqft=SubQuery(RMR_SQ.values("livablesqft")[:1])) \
.filter(sqft__gte=1500)

我正在查看 15-45 分钟范围内的查询时间 - 但我最终会得到结果... 关于如何在保持非外键链接结构的同时加快速度的任何想法?


Django 1.11.8PostgreSQL 9.5Droplet 配备 8GB RAM,4 核

最佳答案

这个答案是受到 @bma 和 @wholevinski 评论的启发。

Django docs 中所述,

A database index is automatically created on the ForeignKey.

这个子查询问题的关键是在 JOIN 字段上建立索引(在我的问题中又名:parcel)。这很简单,看起来像这样:

class OwnershipRecord(Model):
parcel = CharField(max_length=10, unique=True,
db_index=True)
owner_name = ...
other data fields ...

ResidentialMasterRecord(Model):
parcel = CharField(max_length=10, unique=True,
db_index=True)
livablesqft = ...
lotsqft = ...

docs因为这是稀疏的,但很容易实现。

db_index

Field.db_index

If True, a database index will be created for this field.

结果:我的查询时间从约 30 分钟缩短到 1.55 秒。


>>> import timeit
>>> from django.db.models import OuterRef, Subquery
>>> from leads.models import Lead
>>> from ownership.models import OwnershipRecord
>>> from mcassessor.models import ResidentialMasterRecord
>>> rmr_sq = ResidentialMasterRecord.objects.filter(parcelid=OuterRef('ownership_record__parcel'))
>>> qs = Lead.objects.select_related('ownership_record').annotate(sqft=Subquery(rmr_sq.values("livablesqft")[:1])).filter(sqft__gte=1700)
>>> toc = timeit.default_timer()
... qs_list = list(qs)
... print(timeit.default_timer() - toc)
[Out] 1.55457401276
>>> len(qs_list)
[Out] 823

关于django - Django 1.11.8 中的子查询非常慢 - 我可以加快速度吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48153293/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com