使用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
?
答案 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;