2

4 列 (1 PK) のテーブルがあり、そこから 30 行を選択する必要があります。これらの行のうち、2 つの列 (列 A と B) は別のテーブルに存在する必要があります (8 つの列、1 つの PK、2 つは A と B)。

2 番目のテーブルは大きく、何百万ものレコードが含まれており、col の値を含む行が 1 つでも存在するかどうかを知るだけで十分です。1テーブル目のAとB。

以下のコードを使用しています。

query = db.Session.query(db.Table_1).\
        filter(
            exists().where(db.Table_2.col_a == db.Table_1.col_a).\
                     where(db.Table_2.col_b == db.Table_2.col_b)
        ).limit(30).all()

このクエリは私が望む結果を取得しますが、機能するa limit条件を暗示したり、.exists()select 1select *

exists() does not accept a .limit(1)

テーブル全体を検索しないように制限を設定して、このクエリの実行を高速化するにはどうすればよいですか?

  • Table_2のレコードに2 つの列が存在するTable_1 からn 行が必要です

ありがとうございました

4

2 に答える 2

7

hereで述べたように、より明示的な形式を使用して「select 1」を実行できます。つまり、

exists([1]).where(...)

しかし、私は昔から頑固な「1 を選択」するタイプの人間でしたが、「1」と「*」を使ってパフォーマンスを表現することはもはや神話( more / more ) であることを学びました。

exists() は select() のラッパーでもあるため、最初に select() を構築することで limit() を取得できます。

s = select([1]).where(
         table1.c.col_a == table2.c.colb
       ).where(
         table1.c.colb == table2.c.colb
       ).limit(30)
s = exists(s)
于 2013-01-31T00:29:43.410 に答える