今回はインデックスとオプティマイザに関して取り上げます。
SQL Serverの初心者向けの内容となっております。
インデックス・オプティマイザとは...
まずは備忘録を兼ねてインデックス、オプティマイザの役割から復習します。
以下がそれぞれの役割です。
- インデックス…データベース内のデータを効率的に検索し、アクセスする
- オプティマイザ…効率よく最適化されたクエリの実行計画を決めて実行する
WITH句を使って指定のインデックスを使用することはできますが、毎度毎度インデックスを指定しているわけではありません。
そんな時には、オプティマイザがインデックスを選択して効率的に処理を進めます。
オプティマイザのインデックス選択根拠...
先ほど申し上げましたように、オプティマイザは自動でインデックスを選択して効率的に処理を進めてくれます。
では、オプティマイザは何を基準にインデックスを選択するのでしょうか。
答えは"統計情報"です。
統計情報とはどのあたりにどういったデータがあるかというデータ分布や、レコード数や列数/列のサイズを表す情報のことです。
このような情報を元にして、オプティマイザはどのような操作を行えば、効率的に処理を実行できるか判断してくれるというわけですね。
統計情報の更新タイミングについて...
統計情報はDBが更新されると常に最新のものになるのでしょうか?
答えはNOです。
統計情報の更新契機として以下の2つがあります。
- ① UPDATE STATISTICSが実行されたとき。
- ② 自動更新オプション(AUTO_UPDATE_STATISTICS または AUTO_UPDATE_STATISTICS_ASYNC)がONの時、テーブルのおよそ20%に相当するデータが更新された状態でUPDATE、SELECT、DELETE、MERGEが実行されたとき。
(参照:https://learn.microsoft.com/ja-jp/archive/blogs/jpsql/on-12)
②については自動更新オプションがONの状態であっても、20%相当のデータが更新されなければ統計情報が更新されないということですね。
また、注意点として20%に相当するデータが更新された際に更新されるわけではないため、20%のデータが更新された状態でUPDATEなどのDML文が実行された時に統計情報が更新されるということも念頭に置いておきたいです。
最後に...
オプティマイザは効率的なインデックスを選択してくれますが、それが常に最善というわけではありません。
実際、以前対応した不具合の中でオプティマイザが非効率的なインデックスを選択してしまい、処理に時間がかかってタイムアウトが起こってしまう、といったものがありました。
オプティマイザは賢いものですが、その振る舞いには十分に注意して実装を進めていきたいものです。
また、調査時にもこのオプティマイザの振る舞いを予測することで、効率的な調査が期待できます。
以上です。最後まで読んでいただきありがとうございました。