У меня есть два идентичных запроса, кроме позиции левого соединения в предложении 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()
Другими словами, я не могу контролировать, где создается ЛЕВОЕ СОЕДИНЕНИЕ.
Как мне сделать SQLite и / или SQLAlchemy умнее?