ln-812-query-optimizer について
コード保守向けのクエリ最適化スキルです。監査結果または指定ファイルから非効率なクエリを特定し、変更ごとにテストして採用または差し戻しを判断し、修正レポートを作成します。
主な機能
- 01監査結果の読み込みまたは対象ファイルの調査
- 02影響度に基づく対応順の決定
- 03N+1、重複取得、過剰取得の修正
- 04テスト結果に基づく採用または差し戻し
- 05修正内容と失敗理由の報告
活用シーン
- 01クエリ効率監査で見つかった問題への対応
- 02リクエストのホットパスにある N+1 の最適化
- 03重複取得や不要なフィールド取得の削減
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ levnikolaevich/ claude-code-skills --skill ln-812-query-optimizerインストール後、Claude Code で/ln-812-query-optimizerを入力して読み込まれたか確認します。
詳細
パス: ファイルパス(
shared/、references/、../ln-*)は、skills リポジトリのルートからの相対パスです。CWD に見つからない場合は、この SKILL.md があるディレクトリを見つけ、1 つ上の階層をリポジトリのルートとして参照してください。
ln-812-query-optimizer
タイプ: L3 Worker カテゴリ: 8XX 最適化 親: ln-810-performance-optimization-coordinator
ln-651-query-efficiency-auditor が検出したクエリ効率の問題を修正します。各修正は、採用/破棄のパターンを用いてテストで検証します。指標はクエリ数の削減です(実行時間のベンチマークではありません)。
概要
| 項目 | 詳細 |
|---|---|
| 入力 | docs/project/persistence_audit.md(ln-651 のセクション)の監査結果、または対象ファイル |
| 出力 | 最適化されたクエリ、検証レポート |
| 連携先 | ln-651-query-efficiency-auditor(問題を検出)→ ln-812(問題を修正) |
ワークフロー
フェーズ: 事前確認 → 検出結果の読み込み → 優先順位付け → 修正ループ → レポート
フェーズ 0:事前確認
| 確認項目 | 必須 | 不足している場合の対応 |
|---|---|---|
| 監査結果または対象ファイル | はい | 最適化をブロック |
| テスト基盤 | はい | ブロック(検証にはテストが必要) |
| Git のクリーンな状態 | はい | ブロック(差し戻し用のクリーンなベースラインが必要) |
必ず読むこと: shared/references/ci_tool_detection.md を読み込み、テストの検出には Test Frameworks セクションを使用してください。
ワークツリーとブランチの分離
必ず読むこと: shared/references/git_worktree_fallback.md を読み込み、ln-812 の行を使用してください。
フェーズ 1:検出結果の読み込み
監査レポートから読み込む場合
docs/project/persistence_audit.md を読み込み、ln-651 の検出結果を抽出します。
| 検出タイプ | 最適化 |
|---|---|
| N+1 クエリ | バッチ読み込み/イーガーローディング/.Include()/prefetch_related |
| 重複した取得 | ID の代わりにオブジェクトを渡す、結果をキャッシュする |
| 過剰なデータ取得 | 必要なフィールドのみ選択する/プロジェクション/.Select() |
| インデックスヒントの不足 | インデックスのアノテーション/マイグレーションを追加する |
| 上限のないクエリ | .Take()/LIMIT/ページネーションを追加する |
対象ファイルから読み込む場合
監査レポートがない場合は、対象ファイルをスキャンし、上の表に該当するクエリパターンを探します。
フェーズ 2:修正の優先順位付け
| 優先度 | 基準 |
|---|---|
| 1(最高) | ホットパス(リクエストごとに呼び出される箇所)の N+1 |
| 2 | 重複した取得(同じエンティティが複数回読み込まれる) |
| 3 | 過剰なデータ取得(必要なカラムが少数なのに SELECT * を使用) |
| 4 | ユーザー向けエンドポイントのページネーション不足 |
フェーズ 3:修正ループ(採用/破棄)
修正ごとのサイクル
FOR each finding (F1..FN):
1. APPLY: Edit query code (surgical change)
2. VERIFY: Run tests
IF tests FAIL → DISCARD (revert) → next finding
3. VERIFY: Tests PASS → KEEP
4. LOG: Record fix for report
採用/破棄の判断
| 条件 | 判断 |
|---|---|
| 影響を受けるファイル/関数をカバーするテストがない | 検出項目をスキップ — 「未カバー、スキップ」として記録 |
| テストに合格する | 採用 |
| テストに失敗する | 破棄し、失敗理由を記録 |
| 修正によって新たな N+1 が発生する | 破棄 |
注: ベンチマークは不要です。クエリ最適化の指標は、正しさ(テストに合格すること)と構造上の改善(クエリが減ること)です。非効率な箇所はすでに監査で特定されています。
フェーズ 4:結果のレポート
レポートスキーマ
| フィールド | 説明 |
|---|---|
| source | 監査レポートのパスまたは対象ファイル |
| findings_total | 監査で検出された項目の合計 |
| fixes_applied | 正常に採用された修正 |
| fixes_discarded | 理由を添えて破棄された修正 |
| fix_details[] | 修正ごとの詳細:検出タイプ、ファイル、修正前/修正後の説明 |
設定
Options:
# Source
audit_report: "docs/project/persistence_audit.md"
target_file: "" # Alternative to audit report
# Verification
run_tests: true
# Scope
fix_types: # Filter which types to fix
- n_plus_one
- redundant_fetch
- over_fetching
- unbounded_query
エラー処理
| エラー | 原因 | 解決策 |
|---|---|---|
| 監査結果がない | ln-651 が実行されていない、または問題がない | 「最適化する検出項目なし」と報告する |
| ORM 固有の構文 | ORM が不明 | ORM のドキュメントを Context7/Ref で検索する |
| マイグレーションが必要 | インデックスの追加にマイグレーションが必要 | 手動作業として記録し、スキップする |
参考資料
../ln-651-query-efficiency-auditor/SKILL.md(連携先:問題を検出)shared/references/ci_tool_detection.md(テストの検出)
完了の定義
- 監査レポートまたは対象ファイルのスキャンから検出事項を読み込みます
- 修正に優先順位を付けます(まず N+1、その後に冗長なクエリ、過剰な取得、上限のないクエリ)
- 各修正を適用し、採用または破棄します。テストに合格した場合は採用し、失敗した場合は破棄します
- 修正によって新たなクエリの非効率性を生じさせません
- 検出事項の合計数、適用した修正、破棄した修正を含むレポートを返します
バージョン: 1.0.0 最終更新日: 2026-03-08