この特集のトップページへ

統計情報

 リレーショナルエンジンは,最低I/Oコストのインデックスを決定するために,データベース内に格納されている統計情報を使用する。統計情報とは,インデックス条件に合致する行数がどの程度あるのかを示したもので,インデックス統計に基づいてリレーショナルエンジンが算出する。リレーショナルエンジンは,インデックス統計から取得した総行数に対する総論理I/O数を計算し,検索パス(テーブルへのアクセス経路)を決定する。通常,統計情報は,テーブルへのアクセスに基づきSQL Serverが定期的に自動更新する。しかし,SHOWPLAN表示で「適切な統計情報がない」旨のメッセージが通知される場合は,統計情報の作成と自動更新の設定を調べる必要がある。さらに統計情報の更新日についても調べる必要がある。

 統計情報の最新更新日は,次のようなSQLステートメントで調べることができる。

   SELECT STATS_DATE (table-id, index-id) FROM sysindexes

 たとえば,pubsデータベースのauthorsテーブルに対してこのSQLステートメントを実行すると,次のような出力が得られる(table_idがわからない場合は,“SELECT id FROM sysobjects WHERE name = 'authors'”のように,sysobjectsシステムテーブルから取得する。index_idの場合も同じ方法で取得できる)。

Fig.9-31 SELECT STATS_DATEステートメントの出力例


 また,DBCC SHOW_STATISTICSステートメントを使用すれば,インデックスの統計情報を入手することもできる。いずれかの方法でインデックスの統計情報の更新日を調べ,あまりに古いようであれば,統計情報が自動更新されるように設定されているかどうかを確認する。

Fig.9-32 DBCC SHOW_STATISTICSステートメントの出力例


 統計情報を自動更新するか否かは,SQL Server Enterprise Managerのテーブルデザイン画面からも設定できる。テーブルデザイン画面で任意の列を右クリックすると表示されるメニューから[プロパティ]を選択し,表示された[プロパティ]ダイアログボックスの[インデックス/キー]パネルを開いて[動的に統計値を再計算しない]オプションの状態を確認する。このオプションがチェックされている場合には,統計情報は自動更新されない。自動更新させたい場合には,チェックを解除して[閉じる]ボタンを押す。

Fig.9-33 テーブルデザインのプロパティ


 もしインデックスの統計情報を自動更新させていないのであれば,データの10〜20%以上が修正・挿入・削除された時点,もしくはインデックスの列の10〜20%以上が修正された時点で,UPDATE STATISTICSステートメントまたはsp_updatestatsシステムストアドプロシージャを実行し,最新の統計情報に更新しなければならない。

   UPDATE STATISTICS table
    [index | (statistics_name[,...n])]
    [WITH
    [ [FULLSCAN] | SAMPLE number {PERCENT | ROWS}]]
    [[,] [ALL | COLUMNS | INDEX]
    [[,] NORECOMPUTE]]

【引数】
table……統計を更新するテーブル名を指定する。
index……統計を更新するインデックス名を指定する。省略すると指定したテーブルのすべてのインデックスの統計が更新される。インデックス名を調べる場合には,sp_helpindexシステムストアドプロシージャを使用する。

Fig.9-34 sp_helpindexシステムストアドプロシージャの実行例


statistics_name……更新する統計グループ(コレクション)の名前を指定する。統計グループはCREATE STATISTICSステートメントを使用して作成することができる。
FULLSCAN……テーブル内のすべての行を読んで統計を収集する場合に指定する。SAMPLE 100 PERCENTを指定した場合と同じ動作である。
SAMPLE number {PERCENT | ROWS}……大きなテーブルの統計を更新するときにサンプリングして統計を収集する場合にテーブルの割合または行数を指定する。省略すると必要なサンプルサイズを自動的に計算し,対象のテーブルをスキャンする。
ALL | COLUMNS | INDEX……列統計,インデックス統計,またはすべての既存の統計を更新するのか否かを指定する。デフォルトはALLである。
NORECOMPUTE……古くなった統計情報を自動的に再計算しない場合に指定する。このオプションを指定した場合,統計情報の自動更新が無効となり,NORECOMPUTEオプションを指定せずにUPDATE STATISTICSステートメントを再実行するか,あるいはsp_autostatsシステムストアドプロシージャを実行しなければ,有効にならない。

 インデックスの統計情報を自動更新するように設定したい場合は,sp_autostatsシステムストアドプロシージャを使用する。

   sp_autostats [@tblname =] 'table_name'
    [, [@flagc =] 'stats_ flag']
    [, [@indname =] 'index_name']

【引数】
[@tblname =] 'table_name'……UPDATE STATISTICSステートメントを自動実行する対象となるテーブル名を指定する。
[@flagc =] 'stats_ flag' ……指定したテーブルまたはインデックスに対するUPDATE STATISTICSステートメントの自動実行を有効(ON)にするのか,無効(OFF)にするのかを指定する。自動更新させる場合はONにする。
[@indname =] 'index_name' ……UPDATE STATISTICSステートメントの自動実行を有効または無効にするインデックス名を指定する。

 インデックスの統計情報を最新の状態に更新したら,再度「遅いクエリ」を実行し,性能を調べてみる。それでも性能が改善されなければ,以下に説明するクエリの見直しなどを行う。

前へ Chapter 9 14/46 次へ