『 SQL Server の統計情報、特にヒストグラムについて説明してみる 』 についての補足 - その2 -
『 SQL Server の統計情報、特にヒストグラムについて説明してみる 』 で以下のような記事を書きました。
上図の内容を説明していきたいと思います。まずは統計の基本情報です。
Name Updated Rows Rows Sampled Steps Density Average Key Length String Index -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- PK_SalesReason_SalesReasonID Mar 14 2012 1:14PM 10 10 6 1 4 NO 10上記の情報は下記の列から構成されています。
- Name:索引の名称です。
- Updated:統計情報が更新された日時です。
- Rows:このテーブルのレコード件数です。
- Rows Sampled:統計情報を作成するために、サンプリング抽出された行数です。この件数は多いほど精度が高いです。
- Steps:ヒストグラムのデータ区間の数です。(最大200区間です。)
- Density:これは現在のバージョン(2012等)では使用されていません。
- Average Key Length:平均のキー長です。
- String Index:列に文字列が存在する場合は、YES。今回は存在しないので、NOとなります。
統計情報作成時には、常にすべての行を対象にするわけではありません。(テーブルに大量のレコードが存在する場合は、数%程度になります。) Row Sampled の値が非常に低い場合、正確な統計情報が作成されていない場合があります。クエリプランがおかしいと思ったら、Row Samples 数をチェックしてください。異常に低い場合は、下記のコマンドを実行します。
UPDATE STATISTICS [Production].[ProductInventory] [PK_ProductInventory_ProductID_LocationID] WITH FULLSCAN
上記のコマンドは、対象テーブル全件をサンプル対象とします。従ってレコード数が多いテーブルを対象とした場合、システム全体に負荷をかけてしまう恐れがあります。サンプル対象を低くしたい場合は、下記のコマンドを実行します。
UPDATE STATISTICS [Production].[ProductInventory]
[PK_ProductInventory_ProductID_LocationID] WITH SAMPLE 50 PERCENT
上記のコマンドは、対象テーブルの 50% をサンプル対象とします。あと、統計情報の更新に関しては、ここの記事の内容に関しても注意すべきです。
The distribution of data is not altered when an index is rebuilt or reorganised so there is no requirement for statistics to be updated as a result of these operations. However statistics are updated/rebuilt with a 100% sample rate when an index is rebuilt but are not updated not when an index is reorganised. It is, therefore, counter-productive to update stats after a rebuild.
自分自身、恥ずかしながら過去にインデックスの再構築実施後、統計情報を更新していた記憶があります。システム無用な負荷掛けないためにも注意しないといけないですね。