SQL Server | 統計情報の確認方法

【注目記事】

・SEの転職体験談 | 受託開発から自社製品開発へ
・SIer勤務のSEがパソナキャリアに相談してみた
・SIer勤務のSEがマイナビエージェントに相談してみた

SQL Serverのパフォーマンスチューニングの勉強をしていると、統計情報というキーワードがよく出てきます。

「統計情報をもとにクエリオプティマイザがクエリを最適化している」ということは知っていましたが、詳しくは知らなかったので調べてみました。

統計情報とは

SQL Serverの統計情報とは、各テーブルのレコード数や列の数、テーブルやインデックスの中で、どの値がどの程度の頻度で出てくるのか(カーディナリティ)などをまとめた情報です。

この情報をもとに、どのようにレコードを操作すれば効率的なのかをクエリオプティマイザは推測します。

例えば、「社員番号」と「氏名」をもつ「社員テーブル」があり、このテーブルから「社員番号」が100番以上のレコードを取得したいとします。

社員テーブル

レコードを検索するには、テーブルに存在するデータを全てみて探す方法(スキャン)と、索引(インデックス)を利用して探す(シーク)2つの方法があります。

※正確にはスキャンでもインデックスを使用する場合がありますが、ここでは説明を簡略化するために無視しています。

(参考) 実行プランの確認方法

すべての社員番号の中で、100番以上の社員番号が占める割合が大きければ、何度も索引を使うという余計なコストがないスキャンが早いですし、多ければインデックスを使った方が効率的です。

このように統計情報活用することで、どの方法で検索するかを選択します。

統計情報の確認方法

オブジェクトエクスプローラー > データベース > テーブル > 統計から、統計オブジェクトを右クリックします。

統計情報を選択

プロパティを右クリックします。

統計情報のプロパティ
ページの選択から、詳細をクリックします。
統計情報の詳細
※「あ」は気にしないでください・・・。
詳細に表示されるがのが、統計情報です。
統計情報の各項目が何を意味するかは、統計のプロパティの表示を参照してください。

統計情報の更新

統計情報の自動更新タイミング

統計情報を自動更新する設定(AUTO_UPDATE_STATISTICS または AUTO_UPDATE_STATISTICS_ASYNC)がONの場合、テーブル全体の20%のデータが更新されると自動更新されるようです。

おおよそテーブルの 20% に相当するデータが更新されると、そのデータの統計は自動更新の対象になります。

この更新条件が満たされた状態で統計情報を参照する UPDATE, SELECT, DELETE または MERGE ステートメントが実行されると、AUTO_UPDATE_STATISTICS が ON の場合はそのステートメントの一部として統計情報が更新されます。

AUTO_UPDATE_STATISTICS_ASYNC が ON の場合は、そのステートメントによって統計情報更新のための非同期実行タスクがポストされます。

この場合、統計情報はそのステートメントとは無関係に更新され、そのステートメント自身は更新前の統計情報を参照します。

出典 : Microsoft Japan SQL Server Support Team blog

統計情報の自動更新が ON の時には統計情報を手動で更新する必要はない?

統計情報の手動更新

下記のSQLでテーブルの統計情報を更新できます。

その他

実運用で統計情報の更新タイミングを検討した事例

(参考) トラブルシューティングから学ぶSQL Server統計情報の更新タイミング

まとめ

統計情報がボトルネックになってパフォーマンスが低下するのは、主に運用時です。

開発時から統計情報の更新タイミングを検討して、事前にパフォーマンスの低下を予防できるのが理想的です。

参考書籍

SQLスキルを高めるためのおススメ書籍

SQLのスキルを高めるには、学校の試験勉強と同じように多くの問題を解いてみるのが効率的です。

『スッキリわかるSQL入門 第2版 ドリル222問付き! (スッキリシリーズ)』は、SQLの基本的な内容の解説に加え、200問を超える問題が掲載されているので、SQL初心者が学習に使うのにおススメです。

実際、この書籍を新卒1年目の新人さんに2-3週間かけて取組んでもらったことがあり、書籍を読んだ後に簡単なSQLの改修を任せましたが、基本的な部分にはつまずかずに改修を進められました。

1 Comment

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です