GIIP AI Harnessがクエリヒント(Query Hint)を排除する理由
公開日 2026-09-06 · 更新日 2026-09-06 · 最終検証日 2026-09-06
結論
汎用の基盤AIモデルにスロークエリのチューニングを依頼すると、FORCE INDEXや結合ヒントで即座に速度を改善する提案が返ってきがちです。しかしヒントはCBO(コストベースオプティマイザ)がデータ量の増減や分布の変化に応じて実行計画を選び直す機能を止めてしまい、インデックスの新設・統合・削除といった通常のライフサイクル作業とコードを密結合させます。GIIP AI Harnessはこの理由からヒントの使用を原則として排除し、統計情報の整備とSargability(検索条件がインデックスを使える形かどうか)の確保でCBOの自律的な判断を保つよう制約しています。
この文書の適用条件
| 対象製品 | GIIP AI Harness(比較対象: 汎用の基盤AIモデルによるSQL生成) |
|---|---|
| 確認バージョン | 製品バージョンに依存しない設計上の説明(診断SQL例はSQL Server 2008以降を想定) |
| 適用環境 | AWS、Azure、オンプレミス |
| 必要権限 | 診断SQLはVIEW SERVER STATE等の参照権限。コードベース検索はリポジトリの読み取り権限 |
| 実行影響 | 参照のみ(本文中のコマンドは状態を変更しません) |
| 再起動 | 不要 |
| 最終検証日 | 2026-09-06 |
そのまま実行できるコマンド
- 対象
- アプリケーション・ストアドプロシージャのソースコードリポジトリ
- 権限
- リポジトリの読み取り権限
- 変更作業
- なし(検索のみ)
- Production実行
- 該当なし(手元またはCIで実行)
# 対象: アプリケーション・ストアドプロシージャのソースコードリポジトリ
# 権限: リポジトリの読み取り権限
# 変更作業: なし(検索のみ)
# Production 実行: 該当なし(手元またはCIで実行)
# 実行計画を強制する代表的なパターンを横断検索する
# WITH (INDEX(...)) / FORCESEEK / FORCESCAN / 明示的な結合ヒント(LOOP|HASH|MERGE) / OPTION(FORCE ORDER)
grep -RniE "with[[:space:]]*\([[:space:]]*index[[:space:]]*\(|forceseek|forcescan|force[[:space:]]*order|loop[[:space:]]+join|hash[[:space:]]+join|merge[[:space:]]+join" --include=*.sql --include=*.cs --include=*.ts .この検索は正規表現に基づくため、ヒットは「調査対象」であって「確定した強制参照」ではありません。1件ずつ実際の構文を確認したうえで判断してください。
- 対象
- SQL Server 2008 以降 / Amazon RDS for SQL Server / Azure SQL
- 権限
- VIEW DEFINITION
- 変更作業
- なし(参照のみ)
- Production実行
- 可能
-- 対象: SQL Server 2008 以降 / Amazon RDS for SQL Server / Azure SQL
-- 権限: VIEW DEFINITION
-- 変更作業: なし(参照のみ)
-- Production 実行: 可能
SELECT
o.name AS object_name,
o.type_desc AS object_type
FROM sys.sql_modules AS m
INNER JOIN sys.objects AS o
ON o.object_id = m.object_id
WHERE m.definition LIKE '%INDEX(%'
OR m.definition LIKE '%FORCESEEK%'
OR m.definition LIKE '%FORCESCAN%'
OR m.definition LIKE '%FORCE ORDER%'
ORDER BY o.name;アプリケーションのリポジトリに残っていなくても、ストアドプロシージャやビューの定義内にヒントが残っている場合を補完的に見つけるための照会です。
- 対象
- SQL Server 2008 以降 / Amazon RDS for SQL Server / Azure SQL Managed Instance
- 権限
- VIEW SERVER STATE(Azure SQL Databaseの場合はVIEW DATABASE STATE)
- 変更作業
- なし(参照のみ)
- Production実行
- 可能
-- 対象: SQL Server 2008 以降 / Amazon RDS for SQL Server / Azure SQL Managed Instance
-- 権限: VIEW SERVER STATE(Azure SQL Databaseの場合はVIEW DATABASE STATE)
-- 変更作業: なし(参照のみ)
-- Production 実行: 可能
SELECT
OBJECT_NAME(i.object_id) AS table_name,
i.name AS index_name,
ius.user_seeks,
ius.user_scans,
ius.user_lookups,
ius.user_updates,
ius.last_user_seek,
ius.last_user_scan,
ius.last_user_lookup
FROM sys.indexes AS i
LEFT JOIN sys.dm_db_index_usage_stats AS ius
ON ius.object_id = i.object_id
AND ius.index_id = i.index_id
AND ius.database_id = DB_ID()
WHERE i.object_id = OBJECT_ID('dbo.SampleTable')
ORDER BY i.name;このDMVのカウンタはサービス再起動・フェイルオーバー・インスタンス再作成でリセットされます。観測期間が短いだけの「使用率0」を削除の根拠にせず、必ず上記1)・2)のコード検索結果と合わせて判断してください。
結果の読み方
| 列 | 意味 | 確認するポイント |
|---|---|---|
| user_seeks / user_scans / user_lookups | そのインデックスが参照系操作で使われた累積回数 | すべて0でも、直近のサービス再起動・フェイルオーバー以降しか反映されていない可能性がある |
| user_updates | 書き込みに伴うインデックス保守コストの累積回数 | 参照がほぼ無く更新だけが多い場合、削除候補としての優先度が上がる |
| last_user_seek / last_user_scan / last_user_lookup | 最後に参照系操作で使われた日時 | NULLの場合、DMVリセット以降1度も参照されていないことを意味する(それ以前の実績は失われている) |
こういう状況で使います
- 同じ基盤AIモデルに同じスロークエリを渡しても、依頼するツールによって提案内容が違う
- AIが提案したFORCE INDEXや結合ヒントを適用した直後は速くなるが、データ量が増えた数か月後にCPUやI/Oが急増する
- 使用率指標だけを根拠に未使用と判断したインデックスを削除したら、特定のクエリ・ストアドプロシージャが直後に例外を起こした
- インデックスの再設計やDDL変更のたびにアプリケーション側との調整が必要になり、作業が滞る
考えられる原因(可能性の高い順)
01
データ分布の変化による選択度の逆転
同じスキーマでも、国やサービス特性、流入経路によってデータ量とカーディナリティは変わります。データが少ない段階で最適だったIndex Seek + Key Lookupは、行数が数千万件規模に増えたり特定条件にデータが偏ったりすると大量のランダムI/Oを引き起こします。一定の閾値を超えると、Index ScanやClustered Index Scanによるシーケンシャルアクセスの方が速く安定することが少なくありません。ヒントはこの切り替えをCBOに判断させず固定してしまいます。
02
インデックスのライフサイクルとアプリケーションコードの危険な結合
大規模なデータベースは複合インデックスの新設や、重複・未使用インデックスの整理を継続的に行います。特定のインデックスを指す記述がソースコードやストアドプロシージャに直書きされていると、そのインデックスを変更・削除した瞬間に本番で例外(インデックスが見つからない、など)が発生します。大規模サービスの現場では、使用率指標だけを根拠に未使用と判断したインデックスを削除した結果、特定のコード・クエリがそのインデックスを強制的に参照しており、直後に例外が発生する事例は決して珍しくありません。
03
モデルの差ではなくHarnessの差
汎用の基盤モデルは目の前のクエリ文字列だけを見て局所的な最適化を試みます。GIIP AI Harnessは、特定インデックスの強制、静的なデータセットを前提としたチューニング、インデックス変更時にアプリケーションが壊れるリスクを避けるため、ヒントを使わずCBOの判断余地を残す制約をAIの行動範囲(Harness)に組み込んでいます。
確認手順
- 1
コードベース内の計画強制ヒントを横断検索する
参照のみ上記のgrepパターンで、アプリケーション・ストアドプロシージャの双方からWITH (INDEX(...))、FORCESEEK/FORCESCAN、明示的な結合ヒント、FORCE ORDERを検索します。
- 2
インデックスの実使用統計を確認する
参照のみsys.dm_db_index_usage_statsで参照系・更新系の回数と最終参照日時を確認します。
- 3
DMVカウンタのリセット有無を確認する
参照のみ直近のサービス再起動・フェイルオーバー・インスタンス再作成の日時を確認し、観測期間がその後に限られていないかを確認します。観測期間が短い場合、「使用率0」は判断材料として不十分です。
- 4
推定行数と実行計画の選択度を比較する
参照のみ実行計画の推定行数と実際の行数を比較し、データ分布の偏りによる選択度の逆転が起きていないかを確認します。
- 5
Sargabilityを阻害する要素を確認する
参照のみWHERE句の列に対する関数適用や暗黙の型変換など、インデックスを使えなくする書き方が無いかを確認します。
対応方法
すぐに実施できる低リスクの対応
既存クエリ・ストアドプロシージャから計画強制ヒントを外す
中grep結果で見つかったFORCE INDEX・結合ヒント・FORCE ORDERを、影響範囲を確認しながら1件ずつ除去します。除去後は実行計画を比較し、想定外の劣化が無いかを確認します。
インデックス削除の判断基準に横断検索を組み込む
低使用率統計が0であることに加えて、コードベースの横断検索でそのインデックスを強制参照する箇所が無いことを削除の前提条件にします。
事前検討が必要な変更
統計情報を定期的に最新化する運用を整える
低CBOが正しい選択度で判断できるよう、統計情報の自動更新設定と更新頻度を見直します。
インデックスのライフサイクル変更とアプリケーションリリースを分離する
中インデックスの新設・統合・削除を、アプリケーションのデプロイパイプラインと独立して実施できる体制にします。事前に依存確認の横断検索を実施する手順を組み込みます。
専門家のレビューが必要な作業
Sargabilityを確保する形にクエリを再設計する
専門家レビュー必須WHERE句の関数ラッピングや暗黙の型変換を解消し、インデックスがそのまま使える条件式に書き換えます。影響範囲が広い場合は専門的なレビューを経てください。
スケールアウト・スケールアップを見据えたクエリ構造を設計する
高データ量が将来数倍〜数十倍に増える前提で、実行計画がどちらに転んでも破綻しないクエリ構造を検討します。
!注意事項
- sys.dm_db_index_usage_statsのカウンタはサービス再起動・フェイルオーバー・インスタンス再作成でリセットされます。短い観測期間だけで「使用されていない」と判断しないでください。
- コードベースの横断検索は正規表現に基づくため、ヒットは「調査対象」であって「確定した強制参照」ではありません。1件ずつ実際の構文を確認してください。
- 計画強制ヒントの除去は実行計画を変更する操作です。本番適用の前に、ステージング環境で除去前後の実行計画を比較してください。
- AIが提案するヒントも含め、単発のクエリ実行速度だけを根拠にした変更は、データ量が変化した将来の挙動を保証しません。
これで解決しない場合に確認すること
削除予定のインデックスが実行計画キャッシュに残っていないか確認したか
sys.dm_exec_query_statsとsys.dm_exec_sql_textを組み合わせ、直近実行されたクエリの実行計画に対象インデックスへの参照が無いかを確認します。
同じパターンのヒントが他のリポジトリ・他のストアドプロシージャ群にも残っていないか横断確認したか
1つのリポジトリで見つからなくても、別のバッチ処理や別チームが保守するストアドプロシージャに同じ書き方が残っている場合があります。
統計情報の更新日時が古くなっていないか確認したか
CBOの判断はサンプリングされた統計情報に基づきます。統計が古いままでは、ヒントを外してもCBOが正しい選択度で判断できません。
この文書の根拠と限界
実運用で確認した内容
本記事はSQL Serverの公開DMV・カタログビュー仕様(sys.dm_db_index_usage_stats、sys.sql_modules等)と、大規模サービス運用で一般的に見られる傾向を一般化した記述です。特定の障害件数・発生日時・対象システムを特定する情報は含みません。
よくある質問
クエリヒントは一切使ってはいけないのですか?
原則として排除しますが、絶対的な禁止ではありません。オプティマイザの既知の不具合を一時的に回避する場合など、極めて例外的な状況では、影響範囲と切り戻し手順を明示した設計レビューを経たうえで、限定的な使用を検討することはあります。日常的なチューニング手段としては使いません。
同じ基盤AIモデルなのに、なぜツールによって提案内容が違うのですか?
モデル自体の能力差ではなく、モデルの行動範囲を制約する仕組み(Harness)の差です。制約が無ければモデルは目の前のクエリだけを見て局所的な最適化を提案しますが、Harnessが「計画を強制するヒントを使わない」という制約を課していれば、提案はその制約の範囲に収まります。
インデックスを削除する前に、最低限何を確認すればよいですか?
2点セットで確認してください。1つはsys.dm_db_index_usage_statsによる使用率統計、もう1つはコードベースとストアドプロシージャ定義に対する強制参照ヒントの横断検索です。使用率統計だけでは、直近の再起動以降の期間しか反映されていない可能性があります。
Sargability(サーガビリティ)とは何ですか?
WHERE句などの検索条件が、インデックスをそのまま使える形になっているかどうかを表す性質です。列に関数を適用したり、暗黙の型変換が発生したりする条件式は、インデックスがあっても使われずテーブルスキャンになりがちです。ヒントで無理に使わせるのではなく、条件式の書き方を見直して確保します。
MAXDOPのような並列度を制御するヒントも同じ理由で禁止されますか?
いいえ。本記事が対象とするのは、FORCE INDEXや結合ヒント、FORCESEEK/FORCESCANのように実行計画のインデックス選択・結合順序をAIが固定してしまう種類のヒントです。MAXDOPのような並列度・リソース制御のためのヒントは別の性質の設定であり、関連記事(MAXDOPとCost Threshold for Parallelismの設定)で扱っています。
この文書がカバーする質問
- なぜAIによってSQLチューニングの提案内容が違うのか
- クエリヒントを使うとどんなリスクがあるか
- インデックスを削除する前に何を確認すればよいか
リスク表示の意味
- 参照のみデータと設定を変更しません。
- 低影響は限定的ですが、権限と負荷の確認が必要です。
- 中性能・ロック・コストに影響する可能性があります。
- 高障害・データ損失・復旧作業が発生する可能性があります。
- 専門家レビュー必須本番適用前に別途レビューが必須です。
GIIPの対応範囲
GIIP AI Harnessは、生成・提案するSQLにFORCE INDEXや明示的な結合順序ヒントを含めないことを設計上の制約としており、性能改善の提案はインデックス設計の見直しや統計情報の整備、クエリのSargability確保など、CBOの判断を阻害しない手段に限定しています。また、インデックスのライフサイクル変更(新設・統合・削除)を検討する際は、使用率統計の一時点の値だけでなく、対象インデックスを強制参照するコードが残っていないかの横断検索を組み合わせることを運用上の前提としています。
執筆・技術検証
GIIP プロダクション運用チーム
大規模Webサービス、SQL Server、Oracle、AWS、Azureの設計・移行・運用に約30年従事。x12largeクラスのAWS RDS for SQL Server環境12セット、約12万テーブルのOracle環境、約3TBのTiDBからAurora MySQLへの移行を経験。現在も複数のクラウドデータベースと約30のWebサービスを、AIエージェントと人間の専門家が継続的に監視・運用しています。
AIの自動実行に承認とロールバックが必要な理由と、その設計方法
自動実行の設計要素(スナップショット・承認ゲート・dry-run分離・allowlist・冪等性・監査ログ・段階的展開・停止スイッチ)と、承認なしに実行してはならない操作の線引きを整理します。
sql-serverSQL ServerのMAXDOPとCost Threshold for Parallelismを確認・変更する方法
サーバー・データベース・クエリの3階層で並列度を確認し変更する手順と、それぞれの適用範囲・影響範囲の違いを整理します。
sql-serverSQL ServerでCXPACKET待機が多いときの原因と確認方法
sys.dm_os_wait_stats と sys.dm_os_waiting_tasks で CXPACKET を評価し、CXCONSUMER との区別を踏まえて並列度の見直しに進むための手順です。
giipコーディングエージェントとGIIP FDE Opsは何が違うのか
コーディングエージェントと運用サービスは「作業の単位」が違います。両者のスコープの境目を9つの観点で比較し、自組織で確認できるコマンドを添えています。
関連サービス
クエリヒント依存度を点検しCBO前提の構造に見直す
同じ確認を複数の環境で継続する必要がある場合は、運用体制ごと相談できます。
クエリヒント依存度を点検しCBO前提の構造に見直す