在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))

执行join之前或之后使用filter

在执行联接之前或之后使用过滤器?

在加入之前使用过滤器并不重要。SQLalchemy可能会将加入放在过滤器之前,因为这是SQL通常的样子。

但是,数据库中的查询优化引擎负责优化。例如,在PostgreSQL上,您可以进行查询并放置explain analyze,以便更好地了解发生的事情。

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

我的建议是:不要优化。数据库是非常酷的技术,主要是正确的事情。如果某些事情很慢,则很可能是因为您忘记添加索引。如果您正在使用1亿 行工作,则可能会开始遇到限制,您可能会开始担心查询如何执行。但是我怀疑您当时是。

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

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

转化为

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

答案显然取决于。

@univerio是正确的,Sqlalchemy滤波器确实简单地转换为某个地方,但是可以安排查询的实际执行计划,以便首先应用过滤器。它仅取决于查询和优化器的实现。

我找到了有关SQL操作顺序的答案,以最有助于理解这一点。

最新更新