SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

統計情報の statblob について

leave a comment

SQL Server ではクエリ実行時にオプティマイザーがクエリプランを作成する際に [統計情報] を使用してデータの分布状況を判断します。

今回はその統計情報の格納先についてみていきたいと思います。

SQL Server 2005 の情報になりますが、以下の技術情報に詳細が記載されています。
Microsoft SQL Server 2005 のクエリ オプティマイザが使用する統計情報

■統計情報の基本的な確認方法


統計情報を確認するための方法として [DBCC SHOW_STATISTICS] があります。

DBCC SHOW_STATISTICS (N’dbo.Table_1′, N’PK_Table_1′)

 

上記のようなクエリを実行すると対象のインデックスや、列の統計情報を取得することが可能です。

image

統計情報はデータの密度 / 分布を格納しています。
[WITH HISTOGRAM] を付けて実行するとどのようなデータがどのような分布で入っているのかを確認することが可能です。

また、統計情報のレコードは以下のクエリで格納することが可能です。

SELECT
    *
FROM
    sys.stats
WHERE
    name = N’PK_Table_1′

 

image

 

■統計情報の格納先


統計情報の実データですが、[statblob] という名称で BLOB (Binary Large Object) データとして格納されています。
統計情報を更新することができる [sp_updatestats] を実行した時のログレコードの内容を確認してみます。

SELECT
    [Current LSN],
    [Operation],
    [Context],
    [Transaction ID],
    [AllocUnitName],
    [Page ID],
    [Slot ID]
FROM
    fn_dblog(NULL, NULL)
WHERE
    AllocUnitId IS NOT NULL

image

[AllocUnitName] からいくつかのテーブルに対して変更がかかっていることが確認できます。

この中でシステムアロケーションテーブル (GAM / PFS / IAM) 以外を更新しているものを抜き出してみます。
image

[sys.sysobjvalues] テーブルに対して変更しているのが確認できますね。
Books Online ではこのテーブルの説明は以下のようになっています。

すべてのデータベースに存在します。エンティティの一般的な値のプロパティごとに 1 行のデータを格納します

このテーブルに統計情報が行データとして格納がされています。
[sys.sysobjvalues] ですが、単純に検索をしようとすると以下のようにメッセージが表示され、検索することができません。
# Denali の CTP 1 を使っているので英語メッセージになっています。

Msg 208, Level 16, State 1, Line 1
Invalid object name ‘sys.sysobjvalues’.

このテーブルはシステムテーブルになるのですが、DAC で接続をしないと検索することができません。
image

先頭に [ADMIN:] を付与して接続をして検索をしてみます。

USE [TEST]
SELECT
    valclass,
    objid,
    OBJECT_NAME(objid) AS objname,
    value,
    imageval
FROM
    sys.sysobjvalues
WHERE
    objid = 245575913

image

[imageval] という Binary 列があるのですがこれが統計情報を格納している [statblob] になるようです。

BLOB の細かな見方がまだわかっていないので、現在はここまでしか追えないのですが…。

追加で情報をとれるようになったら改めて投稿したいと思います。

Share

Written by Masayuki.Ozawa

4月 17th, 2011 at 10:59 pm

Posted in SQL Server

Tagged with

Leave a Reply