13

N+1 と悪い DB クエリの重大なパフォーマンスへの影響について同僚と話した後、 http: //guides.rubyonrails.org/active_record_querying.htmlにアクセスしました。

ActiveRecord (レール):

clients = Client.includes(:address).limit(10)

クライアントがアドレスを持っていて、クライアントをループしながらそれらにアクセスしようとしている場合、Rails はincludes先に進んでそれらをクエリに追加するように通知します。これにより、すぐに 9 つのクエリが不要になります。

ジャンゴ:

https://github.com/lilspikey/django-batch-selectは、バッチ クエリのサポートを提供します。上記のRailsが提供するものを達成するための他のライブラリやトリックを知っていますか? また、バッチ選択は同じ方法で懸念に対処しますか、それともこれら 2 つの異なることですか?

select_relatedところで、一見答えのように見えるかもしれませんが、私は について尋ねているわけではありません。addressへの外部キーがある状況について話していますclient

4

3 に答える 3

13

Django 1.4 以降、prefetch_related で実行できます: https://docs.djangoproject.com/en/dev/ref/models/querysets/#prefetch-related

1.4 未満を使用している場合は、次のモジュールをご覧ください: https://github.com/ionelmc/django-prefetch

Django の prefetch_related よりも柔軟であると主張しています。冗長ですが、うまく機能します。

于 2013-01-21T03:24:16.573 に答える
9

残念ながら、Django の ORM にはまだこれを行う方法がありません。

幸いなことに、Python で少し作業を行えば、2 つのクエリだけでそれを行うことができます。

clients = list(Client.objects.all()[:10])
addresses = dict((x.client_id, x) for x in
    Address.objects.filter(client__in=clients))
for client in clients:
  print client, addresses[client.id]
于 2011-03-24T16:22:57.577 に答える
2

私はまだ試していませんが、django-batch-selectはこの問題に対する答えを提供するはずです。上記のイグナシオの答えは私にとって最良のようです。

于 2011-11-11T17:41:45.967 に答える