SQL Server ではクエリ実行時にオプティマイザーがクエリプランを作成する際に [統計情報] を使用してデータの分布状況を判断します。
今回はその統計情報の格納先についてみていきたいと思います。
SQL Server 2005 の情報になりますが、以下の技術情報に詳細が記載されています。
Microsoft SQL Server 2005 のクエリ オプティマイザが使用する統計情報
Contents
■統計情報の基本的な確認方法
統計情報を確認するための方法として [DBCC SHOW_STATISTICS] があります。
DBCC SHOW_STATISTICS (N’dbo.Table_1′, N’PK_Table_1′) |
上記のようなクエリを実行すると対象のインデックスや、列の統計情報を取得することが可能です。
統計情報はデータの密度 / 分布を格納しています。
[WITH HISTOGRAM] を付けて実行するとどのようなデータがどのような分布で入っているのかを確認することが可能です。
また、統計情報のレコードは以下のクエリで格納することが可能です。
SELECT |
■統計情報の格納先
統計情報の実データですが、[statblob] という名称で BLOB (Binary Large Object) データとして格納されています。
統計情報を更新することができる [sp_updatestats] を実行した時のログレコードの内容を確認してみます。
SELECT |
[AllocUnitName] からいくつかのテーブルに対して変更がかかっていることが確認できます。
この中でシステムアロケーションテーブル (GAM / PFS / IAM) 以外を更新しているものを抜き出してみます。
[sys.sysobjvalues] テーブルに対して変更しているのが確認できますね。
Books Online ではこのテーブルの説明は以下のようになっています。
すべてのデータベースに存在します。エンティティの一般的な値のプロパティごとに 1 行のデータを格納します
このテーブルに統計情報が行データとして格納がされています。
[sys.sysobjvalues] ですが、単純に検索をしようとすると以下のようにメッセージが表示され、検索することができません。
# Denali の CTP 1 を使っているので英語メッセージになっています。
Msg 208, Level 16, State 1, Line 1 |
このテーブルはシステムテーブルになるのですが、DAC で接続をしないと検索することができません。
先頭に [ADMIN:] を付与して接続をして検索をしてみます。
USE [TEST] |
[imageval] という Binary 列があるのですがこれが統計情報を格納している [statblob] になるようです。
BLOB の細かな見方がまだわかっていないので、現在はここまでしか追えないのですが…。
追加で情報をとれるようになったら改めて投稿したいと思います。