django-query-plan-reading について
特定の Django クエリセットや SQL 文でデータベースにどのような処理が発生しているかを調べるスキルです。実行計画の生成と読み取り、変更の選択、変更前後の比較を案内します。
主な機能
- 01ORM と生 SQL の実行計画生成
- 02スキャン、結合、ソート、推定値の確認
- 03計画に基づく変更の選択
- 04変更前後の実行計画の比較
活用シーン
- 01遅い Django クエリセットの調査
- 02インデックスが有効かどうかの確認
- 03クエリ書き換えの効果検証
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ lvtd-llc/ skills --skill django-query-plan-readingインストール後、Claude Code で/django-query-plan-readingを入力して読み込まれたか確認します。
同梱ファイルreferences/explain-checklist.md
詳細
Django クエリプランの読み方
特定の SQL 文またはクエリセットが処理コストの大部分を占めている場合に、このスキルを使用します。ORM コードから推測するのではなく、データベースが処理に時間をかけている理由を説明することが目的です。
ワークフロー
-
正確なクエリを取得します。
- そのクエリを生成したクエリセットを優先します。
- ログに記録された SQL から始める場合は、バインドされたパラメーター、または代表的なリテラル値を含めます。
-
プランを生成します。
- ORM が管理する SQL には
queryset.explain()を使用します。 - 生の SQL、ビュー、マテリアライズドビュー、またはログからコピーした SQL には、データベースの
EXPLAINを使用します。 - データベースがクエリを実行するため、安全な環境でのみ
analyze=Trueを使用します。
- ORM が管理する SQL には
-
最も深いノードから外側に向かって読みます。
- テーブルスキャン、インデックススキャン、結合、ソート、集約、制限を特定します。
analyzeを使用する場合は、推定行数と実際の行数を比較します。- 後続のノードに多数の行を渡す高コストなノードを探します。
-
次に行う変更を決めます。
- 選択性の高いアクセス経路がない場合:
django-index-designを使用します。 - クエリの形状が有用なインデックスアクセスを妨げている場合:フィルター、並べ替え、または結合方法を書き換えます。
- 避けられない大規模な集約の場合:
django-db-side-computationまたはdjango-materialized-viewsを検討します。 - 深いオフセットによるコストの場合:
django-pagination-performanceを使用します。
- 選択性の高いアクセス経路がない場合:
-
変更後、同じプランを再実行します。
- スキャンの種類、行数、ソートノード、ヒープフェッチ数、バッファー、計画時間、実行時間を比較します。
プランの読み取り方や変更前後のレビューに関するメモは、explain-checklist.md を参照してください。
安全に関する注意事項
EXPLAIN ANALYZEはクエリを実行します。影響を把握していない限り、更新処理、安全でない関数、本番環境の処理には使用しないでください。- シーケンシャルスキャンが必ずしも悪いとは限りません。テーブルが小さい場合や、述語がテーブルの大部分に一致する場合は、最適なことがあります。
- インデックスが使用されていても、必ずしも良いとは限りません。ランダムなヒープアクセス、不適切なカーディナリティ推定、またはインデックス適用後のソートが、依然としてパフォーマンスを支配することがあります。
検証
変更前後のプランの抜粋を示し、どのノードが変わったのか、またその変更が重要な理由を平易に説明して仕上げます。
コメント
Markdown 対応