Python 改进了过滤空父项并仅返回父项ID的不同列表以使用.in条件进行测试,而不是针对数百万个空值(包括重复项)测试.in条件,这虽然有效,但速度非常慢

Python 改进了过滤空父项并仅返回父项ID的不同列表以使用.in条件进行测试,而不是针对数百万个空值(包括重复项)测试.in条件,这虽然有效,但速度非常慢,python,orm,sqlalchemy,Python,Orm,Sqlalchemy,目前,对于父项非常少的数据集来说,这似乎运行得很快,但如果父项列表变得非常大(理论上可能如此),我想这可能会再次变慢。我发布这篇文章是为了总结迄今为止最好的工作解决方案,希望有人能提供更好、更具可扩展性的方法 编辑 这个解决方案的性能不是很好,即使不过滤那些属性,也会导致模型上的查询延迟,因此我不得不停用is\u parent和observation\u id混合属性。我定义了一个非混合属性,并修改了查询以回避性能问题: @property def observation_id(self):

目前,对于父项非常少的数据集来说,这似乎运行得很快,但如果父项列表变得非常大(理论上可能如此),我想这可能会再次变慢。我发布这篇文章是为了总结迄今为止最好的工作解决方案,希望有人能提供更好、更具可扩展性的方法

编辑 这个解决方案的性能不是很好,即使不过滤那些属性,也会导致模型上的查询延迟,因此我不得不停用
is\u parent
observation\u id
混合属性。我定义了一个非混合属性,并修改了查询以回避性能问题:

@property
def observation_id(self):
    return self.parent_id if self.is_child else self.id if self.children.count()>0 else None

并且可以通过查询
或(AnnotationLabel.id==self.observation\u id,AnnotationLabel.parent\u id==self.observation\u id)
来查询同一观察组的成员。不理想或不优雅-这种方法会对我希望能够提出的查询类型造成一些限制,因此如果有更好的答案,我会接受。

谢谢你的回答。有趣的方法——它是有效的,但是在整个表上执行fetchall似乎太慢,不实用。该表有数百万行,以这种方式计算父\u id表达式在当前表(不断增长)上需要几分钟的时间。还有其他更有效的方法吗?@Ari,这是我对实施的主要关注。我会考虑的。@Ari,不,不,问题是
。scalar()>0
返回True,查询结果是一个布尔值。要提供筛选,您需要一个查询,该查询返回每个条目的布尔值。如果有一百万个条目,查询必须返回一百万个布尔值。这就是为什么我认为没有一个有效的解决方案与我提出的解决方案明显不同的原因。要添加到讨论中:
db.session.execute(db.select([func.count(AnnotationLabel.id)])。其中(AnnotationLabel.parent_id==837838)).scalar()>0
按预期返回True,并且
type(db.select([func.count(AnnotationLabel.id)]).where(AnnotationLabel.parent_id==837838).as_scalar()>0)
是一个:sqlalchemy.sql.elements.BinaryExpression当父/子类不同且不是自引用时,我最初尝试的上述方法似乎有效。抱歉的解决方案159,我无法在5分钟后编辑我之前的评论,因此我不得不删除它,但你上面的回答仍然相关。根据数据集的大小,标量计算仍然非常缓慢。。。六羟甲基三聚氰胺六甲醚。。。我希望有办法解决这个问题!如果您认为答案有帮助或解决了您的问题,您可以投票表决或/或接受答案。这就是Stackoverflow分级的工作原理。此外,如果你自己的答案最相关的话,你也可以接受。我希望不必把它当作答案来接受,以防有人提出更好的解决方案,但我不确定是否有更好的选择。
@property
def observation_id(self):
    return self.parent_id if self.is_child else self.id if self.children.count()>0 else None