私はこれに類似のDjangoコード持っている:私はbulk_create
を使用してModel2
への挿入を最適化しなかった最適化ジャンゴ取得クエリ
for obj in some_list:
m1obj = Model1.objects.get(a=obj.a, b=obj.b, c=obj.c)
Model2(m1=m1obj, d=obj.d, e='foo').save()
を、しかし、これはまだ理由get
Model1
から(〜45秒の痛々しいほど遅いです3kインサートの場合)。
class Meta:
index_together = [
('a', 'b', 'c'),
]
unique_together = [
('a', 'b', 'c'),
]
unique_together
は少し助け、index_together
はあまり影響を与えていないようでした。
私はこの行うための面倒な回避策があります。例えば、私は1つ以上のキーで順必要なすべてのオブジェクトを取得
- フィルター
Model1
を、order_by('a', 'b')
を呼び出し、Djangoが結果をキャッシュしていることを確認してください。等...最初a
その後、b
を検索するlen()
- 使用バイナリサーチ(
from bisect import bisect_left
)(これだけ反復ずっと少ないb
sおよびc
sがありますが、同じである。
これは、挿入時間を短縮より良い、クリーンでこれを行うには、保守の方法が存在しなければならない秒3 の上に!
JUSする。任意の提案ですか? は、Djangoのキャッシュクエリ結果内(スマート)を取得/フィルタリングする方法はありますか?
EDIT:d=obj.d
にd='foo'
を変更 - 任意の一括取得は、それがそうでなければ、私はモデル2エントリを作成することはできません属するタプルにマップできする必要があります。
は残念ながら、あなたの提案は、 '取得()'順次行うよりもはるかに遅いです。私は3分以上それをやめた。また、私の編集で述べたように、パラメータ 'd'と 'e'が一定であれば、これはうまくいきましたか?それらはそうではないので、DBクエリは注文を保証しないので、 'model1_objs'を正しい' obj.d'にマップする方法はありません。 – mibm