django-orm-query-optimization について
Django のデータベースクエリを診断・削減する開発者向けスキルです。特にビューやシリアライザーの N+1 問題を対象に、クエリ調査、関連オブジェクトの読み込み方法、回帰チェックを案内します。
主な機能
- 01クエリ数と重複 SQL の測定
- 02関連オブジェクトの読み込み方法の選択
- 03プリフェッチと遅延フィールドの落とし穴回避
- 04対象を絞ったクエリ数の回帰チェック
- 05クエリ・時間・メモリ変化の比較
活用シーン
- 01シリアライザーの N+1 クエリ削減
- 02テンプレートや管理画面の遅延調査
- 03回帰チェックによる ORM 最適化の検証
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ lvtd-llc/ skills --skill django-orm-query-optimizationインストール後、Claude Code で/django-orm-query-optimizationを入力して読み込まれたか確認します。
同梱ファイルreferences/relationship-and-column-loading.md
詳細
Django ORM クエリの最適化
クエリ数やオブジェクトの読み込みに関する問題には、このスキルを使用します。よくある目標は、レンダリングされる各行やシリアライズされる各オブジェクトが追加のデータベース処理を引き起こす N+1 パターンの解消です。
ワークフロー
-
クエリパターンを確認します。
- 処理が遅い経路について、クエリ数と重複する SQL を記録します。
- 関連クエリを引き起こしているループ、シリアライザーのフィールド、テンプレートのアクセス、管理画面の表示、またはモデルのプロパティを特定します。
-
読み込み方法を選択します。
- 単一値のリレーションシップには
ForeignKeyとOneToOneFieldを使用し、select_related()を使います。 - 複数値のリレーションシップには逆 FK と多対多を使用し、
prefetch_related()を使います。 - 関連するクエリセットにフィルター、並べ替え、アノテーション、またはネストした
select_related()が必要な場合は、Prefetch()を使います。 - モデルインスタンスが不要な場合は、
values()またはvalues_list()を使います。 - 大きなカラムが実際に使われない場合に限り、
only()またはdefer()を使います。
- 単一値のリレーションシップには
-
アクセス方法に一貫性を持たせます。
itemsをプリフェッチした場合、後からitems.filter(...)を呼び出してもプリフェッチキャッシュが使われるとは期待しないでください。prefetch_related()とiterator()を併用する場合は、chunk_sizeを指定します。- すべての呼び出し元で必要な場合を除き、広範なプリフェッチをデフォルトマネージャーに設定しないでください。
-
必要に応じて、対象を絞った回帰チェックを追加します。
- 対象のビューまたはシリアライザー経路で、クエリ数のアサーションを使います。
- 壊れやすいグローバルなクエリ数テストは避けます。
例とレビュー時の確認事項については、relationship-and-column-loading.md を参照してください。
アンチパターン
- メモリ使用量を確認せず、すべてのクエリセットに
prefetch_related()を追加する。 only()を使った後、ループ内で遅延読み込みされたフィールドにアクセスする。- クエリセットを最適化しても、シリアライザーのメソッドフィールドが行ごとにクエリを発行する状態を放置する。
__str__()、モデルのプロパティ、テンプレートのインクルード、または管理画面のリストメソッドにクエリを隠す。
検証
最適化前後のクエリ数と重複クエリのパターンに加え、処理時間またはメモリ使用量の変化を示します。
コメント
Markdown 対応