我有两个相同的查询,除了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变得更聪明?
答案 0 :(得分:1)
我不知道强制SA更改查询的方法。但我想确定为什么查询的执行计划存在差异。我假设如果您在连接列上有索引,则查询中JOINs
的顺序无关紧要。
您可以使用EXPLAIN语句检查执行计划。虽然您需要熟悉The Virtual Database Engine of SQLite。您仍有可能立即发现两个执行计划之间的差异,并且能够提高数据库性能,而不是欺骗SA。
尝试从查询中删除C
或D
,以便更轻松地比较执行计划。