DEV Community 日本語
フォロー
Django 6.1 の FETCH_PEERS は、2,001 クエリのループを 2 に集約します。
Django 6.1 は、明示的な select_related または prefetch_related の呼び出しを必要とせずに N+1 クエリの問題に対処するために fetch_mode を導入しました。fetch_mode 設定、特に FETCH_PEERS は、外部キーのルックアップにおけるクエリ数と実行時間を大幅に削減します。テストでは、FETCH_PEERS が 2,001 クエリのループをわずか 2 クエリに変換し、約 87 倍の改善が見られました。このパフォーマンス向上は select_related の使用に匹敵し、効率的なバッチフェッチを実現します。ただし、FETCH_PEERS はリレーションの逆側には適用されないため、「多」側の N+1 問題には prefetch_related が引き続き必要です。FETCH_RAISE モードは、フィールドへのアクセスをブロックすることで、意図しない遅延ロードを防ぐように設計されています。FETCH_PEERS と QuerySet.iterator() を組み合わせる際には、ピア追跡の仕組みにより N+1 パターンに戻ってしまうという重要な注意点があります。FETCH_PEERS は、クエリセットの関連データの一部のみがアクセスされる場合でも、すべての関連データを積極的にバッチ処理するため、一部のシナリオでは select_related よりも効率が悪い可能性があります。クエリセットのマテリアライズと関連データのフェッチによるメモリオーバーヘッドは、テストされた規模では小さいと指摘されました。FETCH_PEERS を実行する並列スレッドは独立して 2 クエリのカウントを維持し、負荷下での堅牢性を示しました。クエリカウントのデバッグには、バッファ制限に注意が必要です。制限を超えると、サイレントに誤った結果につながる可能性があります。