都内で働くSEの技術的なひとりごと / Technical soliloquy of System Engineer working in Tokyo

都内でサラリーマンやってます。SQL Server を中心とした (2023年からは Azure も。) マイクロソフト系(たまに、OSS系などマイクロソフト以外の技術も...)の技術的なことについて書いています。日々の仕事の中で、気になったことを技術要素関係なく気まぐれに選んでいるので記事内容は開発言語、インフラ等ばらばらです。なお、当ブログで発信、発言は私個人のものであり、所属する組織、企業、団体等とは何のかかわりもございません。ブログの内容もきちんと検証して使用してください。英語の勉強のため、英語の

『 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.

 自分自身、恥ずかしながら過去にインデックスの再構築実施後、統計情報を更新していた記憶があります。システム無用な負荷掛けないためにも注意しないといけないですね。