はじめに
SQL Serverでチューニングをしていると、「インデックスを作ったのに使われない」という場面に遭遇することがあります。
インデックスが効かない原因は一つではなく、統計情報・インデックス設計・SQLの書き方など複数の要因が関係しているケースがほとんどです。
本記事では、実行計画の確認方法とあわせて、「なぜ使われないのか」「どう見抜くか」「どう対処するか」を整理します。
結論:実行計画から原因を切り分ける
インデックスが効かない場合は、まず実行計画を確認します。
特に以下の3点を確認します。
・Index Seek か Scan(Index Scan / Table Scan)か
・推定行数と実際行数に差がないか
・どのインデックスが選択されているか
この3点を見ることで、「統計情報」「インデックス設計」「SQLの書き方」など、どの要因に問題がありそうかを絞り込むことができます。
インデックスが使われない場合でも、必ずしも問題とは限らず、データ量や分布によってはフルスキャンの方が効率的なケースもあります。
まずは実行計画を起点に状況を把握し、原因を切り分けることが重要です。
以下に、代表的な原因と見抜き方・対処の考え方を整理します。
| 原因 | 見抜き方 | 対処 |
|---|---|---|
| 統計情報 | 推定と実測がズレる | UPDATE STATISTICS |
| インデックス設計 | Scanになる | インデックス見直し |
| SQL | 関数・変換あり | 書き換え |
| データ分布 | ヒット率高い | 問題ない場合あり |
| 断片化 | I/O多い | REBUILD |
実行計画の確認方法
SSMSでは以下の手順で確認できます。
・「実際の実行計画を含める」をON(Ctrl + M)
・クエリを実行
・「実行計画」タブを確認
確認時のポイントは以下です。
ScanかSeekか
Index Seekであれば、検索条件に対してインデックスが有効に使われています。
Index ScanやTable Scanの場合は、他の要因を疑います。
推定行数と実際行数
ノードのプロパティで確認できます。
・差が小さい → 見積もりは正しい
・差が大きい → 統計情報の問題の可能性
特に、推定が極端に小さい/大きい場合は注意が必要です。
処理の偏り
コスト割合や矢印の太さから、どこに負荷が集中しているかを確認します。
ボトルネックとなっている箇所が、必ずしもインデックスの問題とは限らない点にも注意します。
主な原因と対処(実務ポイント)
インデックスが効かない原因は複数ありますが、実務では以下を順に疑います。
① 統計情報の問題
なぜ起きるか
統計情報が古いと、SQL Serverはデータ件数を正しく見積もれません。
その結果、本来とは異なる実行計画が選択されます。
見抜き方
・推定行数と実際行数が大きくズレている
・インデックス選択が明らかに不自然
対処
・UPDATE STATISTICSの実行
・自動更新設定の確認
UPDATE STATISTICS(統計情報の更新)について、具体的な内容は以下にまとめています。
SQL Server UPDATE STATISTICSの仕組みと実行タイミング|統計情報の基礎を解説
② インデックス設計の問題
なぜ起きるか
インデックスは「先頭列から順に評価される」ため、検索条件と一致していないと使われません。
典型例
・WHERE句の列が先頭にない
・複合インデックスの順序が逆
・必要な列が不足している
見抜き方
・Index SeekではなくScanになっている
・想定と違うインデックスが使われている
対処
・検索条件に合わせた設計
・複合インデックスの順序見直し
・必要に応じてカバリングインデックス化
③ SQLの書き方の問題
なぜ起きるか
オプティマイザがインデックスを利用できない形になっているためです。
代表例
・列に対して関数を使用している
・暗黙の型変換が発生している
・前方一致でないLIKE検索
見抜き方
・Scanになっているが、インデックスは存在する
・実行計画に変換処理が含まれている
対処
・関数を使わない形に書き換える
・データ型を統一する
・検索条件を見直す
④ データ量・分布の影響
なぜ起きるか
SQL Serverはコストベースで判断するため、ヒット件数が多い場合はフルスキャンが選択されることがあります。
見抜き方
・Scanだが、推定行数は正しい
・対象データがテーブルの大部分を占めている
対処
・基本的には問題なし
・必要に応じてインデックス設計見直し
⑤ インデックスの状態
なぜ起きるか
断片化が進むと、I/O効率が低下しパフォーマンスに影響することがあります。
見抜き方
・断片化率が高い
・I/Oが多いクエリで遅延
対処
・REORGANIZE / REBUILDの実施
断片化の確認方法やREORGANIZE / REBUILDについては、以下の記事にまとめています。
SQL Serverのインデックス断片化を確認する方法|DMVで簡単チェック
SQL ServerのREORGANIZEとREBUILDの違い|使い分けと判断基準を解説
実務での調査手順
インデックスが効かない場合は、以下の順で確認します。
① 実行計画を確認
② 推定行数と実際行数を比較
③ 統計情報を疑う
④ インデックス設計を確認
⑤ SQLの書き方を確認
この順番で確認することで、無駄なく原因にたどり着けます。
まとめ
インデックスが効かない原因は一つではなく、複数の要因が関係します。
・統計情報
・インデックス設計
・SQLの書き方
・データ特性
・インデックスの状態
実行計画を起点にこれらを切り分けていくことが、効率的なトラブルシュートにつながります。


コメント