SQLAlchemy + SQLite左连接性能问题

时间:2011-11-11 03:01:56

标签: sqlite sqlalchemy

我有两个相同的查询,除了from子句中左连接的位置。一个运行非常慢,另一个运行速度非常快(缩写为清晰度):

--SLOW
SELECT DISTINCT b.id
FROM a LEFT OUTER JOIN b ON a.id = b.id
       JOIN c ON a.id = c.a_id 
       JOIN d ON c.id = d.c_id 
WHERE d.value = 9;

--FAST
SELECT DISTINCT b.id
FROM a JOIN c ON a.id = c.a_id 
       JOIN d ON c.id = d.c_id 
       LEFT OUTER JOIN b ON a.id = b.id
WHERE d.value = 9;

我的问题是,使用SQLAlchemy,我似乎只能创建查询的慢速版本。具体来说,我正在使用表继承,并尝试运行以下代码:

return session.query(A).\
       with_polymorphic(B).\
       join(C).\
       join(D).\
       filter(D.value_id == 9).\
       distinct()

换句话说,我无法控制创建LEFT JOIN的位置。

如何让SQLite和/或SQLAlchemy变得更聪明?

1 个答案:

答案 0 :(得分:1)

我不知道强制SA更改查询的方法。但我想确定为什么查询的执行计划存在差异。我假设如果您在连接列上有索引,则查询中JOINs的顺序无关紧要。

您可以使用EXPLAIN语句检查执行计划。虽然您需要熟悉The Virtual Database Engine of SQLite。您仍有可能立即发现两个执行计划之间的差异,并且能够提高数据库性能,而不是欺骗SA。
尝试从查询中删除CD,以便更轻松地比较执行计划。