在SQLAlchemy中,是在连接之前还是之后应用的过滤器?

时间:2017-04-27 22:12:34

标签: python python-3.x sqlalchemy

使用SQLAlchemy,我正在执行如下所示的查询:

import models as m
import sqlalchemy as sa

s = session_maker()
q = s.query(m.ShareCount, m.Article)
.join(m.Article)
.filter(sa.and_(start < m.ShareCount.tstamp, m.ShareCount.tstamp < end))

执行filter之前或之后是否已应用join

3 个答案:

答案 0 :(得分:0)

答案显然取决于它。

@univerio是正确的,sqlalchemy过滤器只是转换为where,但可以安排查询的实际执行计划,以便首先应用过滤器。它只取决于查询和优化器的实现。

我发现this answer regarding the SQL order of operations for WHERE对理解这一点最有帮助。

答案 1 :(得分:0)

在执行联接之前还是之后应用过滤器?

在联接之前应用过滤器并不重要。 SQLAlchemy可能会将联接放在过滤器之前,因为这通常是SQL的样子。

但是,数据库中的查询优化引擎负责优化。例如,在PostgreSQL上,您可以查询并在其前面加上explain analyze,以更好地了解正在发生的事情。

通常很难预测查询在不同数据库系统中的行为。 PostgreSQL和MySQL具有不同的优化技术,因此查询计划也将有所不同。

我的建议是:不要优化。数据库是一种非常酷的技术,大多数情况下都会做正确的事。如果运行缓慢,则很可能是因为您忘记添加索引。如果您要处理超过1亿行,则可能会遇到限制,从而可能开始担心查询的执行方式。但是,我怀疑您当时在这一点上。

答案 2 :(得分:-1)

在SQL中,JOIN发生在WHERE之前。在SQLAlchemy中

session.query(Foo).join(Bar).filter(baz)

转换为

SELECT * FROM Foo JOIN Bar ON ... WHERE baz;