2017-10-13 4 views
3

DjangoでクエリをPostgreSQLデータベースに渡したいとします。大きなID配列を使用してクエリをフィルタリングすると、クエリは非常に遅くなり、最大70秒になります。Postgres DBで大規模なID配列を使用するDjangoクエリフィルタ

this post私の問題を解決した答えを探した後、VALUES (id1), (id2), ...でINステートメントのARRAY [ids]を単に変更してください。

私はpgAdminで内生のクエリで解決策をテストし、クエリが300msのに70年代から行く...

どのように私は(つまり、IDの配列が、VALUESでクエリを使用していない)同じコマンドを行うことができますDjangoで?

+0

実際のdjangoフィルタクエリを投稿してください。 – efkin

答えて

0

トリックが配列を変換することですが何とかを設定します。

の代わりに(このフォームは短い配列のためにのみ良好である):


             
  
    SELECT * FROM tbl t WHERE t.tbl_id = ANY($1); -- WHERE t.tbl_id IN($1); -- equivalent 
  

$1が配列パラメータです。

のように、まだネストしていません。同様に:

SELECT * 
FROM tbl t 
JOIN unnest($1) arr(id) ON arr.id = t.tbl_id; 

それともあなたも、あなたのクエリを維持し、それをネスト解除サブクエリを持つ配列を置き換えることができます。

SELECT * FROM tbl t 
WHERE t.tbl_id = ANY (SELECT unnest($1)); 

または:パッシングなどのパフォーマンスのための

SELECT * FROM tbl t 
WHERE t.tbl_id IN (SELECT unnest($1)); 

同じ効果と表し、VALUESの発現を示す。しかし、通常は配列を渡す方がはるかに簡単です。

詳細説明:

0

は、これはあなたが求めている最初の例ですか?あなたが最初listにキャストした後、2番目のクエリでそれを使用してrelation_listを評価しているので、「IN」コマンドになり

relation_list = list(ModelA.objects.filter(id__gt=100)) 
obj_query = ModelB.objects.filter(a_relation__in=relation_list) 

Djangoはまったく同じことをする代わりに、1つのクエリを作成し、SQL最適化を行います。だから、それはもっと効率的でなければなりません。

obj_query.queryで実行しているSQLコマンドは、何が起きているのか気になる場合は、いつでも参照できます。

質問に答えることを希望しますが、申し訳ありません。

関連する問題