5

Djangoモデルのフィールドnull=Trueの1つに設定しましたが、そのモデルをクエリすると、約10倍遅くなります。ForeignKey(私は使用していselect_related()ます)

変更の前後のPostgresログを見ると、理由の手がかりが得られます。

  • を設定する前null=Trueに、生成されるSQLは、いくつかの内部結合を持つ単一のselectステートメントです。
  • を設定したnull=True、生成されるSQLは結合の1つを除外し、代わりに何千もの同一のselectステートメントが続きます。

これは古典的なn+1クエリの問題であり、これが修正されるまで、パフォーマンスに影響を与えずにフィールドに設定null=Trueするにはどうすればよいですか?ForeignKey

4

2 に答える 2

1

これは、生のクエリで解決できます。'トップレベルのdjangoORM'を使用する代わりにnull=True、クエリを使用して実行する前に生成されたクエリを確認してください。raw故障はORMがPostgresサーバーではないためであるため、SQLコードを直接実行する無駄なコード生成を回避できます。

于 2013-01-17T16:00:02.077 に答える
0

select_related()方法の限界である公式文書から、ここに詳細があります。

select_relate()ただし、の関連フィールドを次のよう に指定することもできます。

modelA.objects.select_related('ModelAForeignKeyName__RelatedModelFeildName')
于 2013-05-10T14:41:47.187 に答える