2

私のコードは現在、次のように SQLAlchemy ORM レイヤーで問題なくクエリを実行します。

session().query(model_a).join(
    (model_b, something == somethingelse)
).join(
    (model_c, something == somethingelse)
) # etc ...

しかし、完了するまでに数分かかるクエリに遭遇しました。私たちが要求した順序で参加していないため、MySQL が原因であることが判明しました。次のように追加STRAIGHT_JOINします。SELECT

SELECT STRAIGHT_JOIN table_a.id FROM table_a INNER JOIN table_b ...

STRAIGHT_JOIN問題は修正されましたが、SQLAlchemy に の後に追加させる方法があるかどうかわかりませんSELECTselect()ドキュメントはヒントをviaに追加できることを示唆してwith_hint(table_a, "STRAIGHT_JOIN")いますが、これにより間違った場所にテキストが追加され、MySQL 構文エラーが発生します。これには、ORM の外に出ることも含まれますが、これは理想的ではありません。

EXPLAINなどのさまざまな MySQL デバッグ手法を使用してみましたがANALYZE TABLE、MySQL が間違ったパスを選択している理由がわかりません。結合の順序を手動で切り替えても効果がないように見えるので、STRAIGHT_JOIN を機能させる必要がある立場になりました。

何か案は?

4

1 に答える 1

5

MySQL とその奇妙なキーワードの場合に限り、これを直接サポートします。

session().query(model_a).prefix_with("STRAIGHT_JOIN").join(
    (model_b, something == somethingelse)
).join(
    (model_c, something == somethingelse)
) # etc ...

http://docs.sqlalchemy.org/en/rel_0_8/orm/query.html?highlight=query.prefix_with#sqlalchemy.orm.query.Query.prefix_with

于 2013-05-24T20:34:18.547 に答える