SE の雑記

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

統計情報のサンプリングについて

one comment

統計情報を更新、作成するときにサンプリングレートを指定しないと既定のサンプリングが設定されます。
UPDATE STATISTICS (Transact-SQL)
統計

現在設定されている統計情報がどの程度のサンプリングで作成されているか確認するための方法をすこしまとめてみたいと思います。

■統計情報のサンプリングの確認


現在作成されている統計情報のサンプリングですが、DBCC SHOWSTATISTICS で確認することができます。
# STAT_HEADER を設定することで、サンプリングが含まれているヘッダー情報だけを表示することができます。

image

実行結果の [Rows] と [Rows Sampled] を確認することで全体行に対してどれくらいのサンプリングで統計情報が作成されたかを確認することができます。

DBCC コマンドで取得しているので、全統計のサンプリングを取得するためにはカーソル等で統計情報の一覧から DBCC コマンドを実行する必要があるかと思います。

DECLARE @sql nvarchar(max) = N’DBCC SHOW_STATISTICS (”@1”, ”@2”) WITH STAT_HEADER’
DECLARE @execsql nvarchar(max)

DECLARE @Table sysname, @Schema sysname, @Stats sysname

DECLARE StatsCursor CURSOR FORWARD_ONLY FOR
SELECT OBJECT_NAME(object_id),OBJECT_SCHEMA_NAME (object_id),name FROM sys.stats WHERE OBJECT_SCHEMA_NAME (object_id) <> ‘sys’
FOR READ ONLY

OPEN StatsCursor

FETCH NEXT FROM StatsCursor
INTO @Table, @Schema, @Stats

WHILE @@FETCH_STATUS = 0
BEGIN

    SET @execsql = REPLACE(REPLACE(@sql, ‘@1’, @Schema + ‘.’ + @Table), ‘@2’, @Stats)
    EXEC (@execsql)
    FETCH NEXT FROM StatsCursor
    INTO @Table, @Schema, @Stats
END

DEALLOCATE StatsCursor

 

image

SQL Server 2008 R2 SP2 / SQL Server 2012 SP1 以降であれば、sys.dm_db_stats_properties (Transact-SQL) で表形式で取得することもできます。

SELECT
    OBJECT_NAME(dsp.object_id)
    , dsp.object_id
    , ss.name
    , dsp.last_updated
    , dsp.rows
    , dsp.rows_sampled
    , dsp.steps
    , dsp.unfiltered_rows
    , dsp.modification_counter
FROM
    sys.stats AS ss
    CROSS APPLY
    sys.dm_db_stats_properties(ss.object_id, ss.stats_id) AS dsp
WHERE
    OBJECT_SCHEMA_NAME(dsp.object_id, DB_ID()) <> ‘sys’

image

sp_updatestatsUPDATE STATISTICS (Transact-SQL) を使用した場合は、通常既定のサンプリングが使用されます。
image

統計情報の更新は自動更新 / 手動更新のほかに、インデックスを再構築 (REBUILD) した際にも実行されます。
インデックスの再構築を実行した場合は、インデックス列をすべて読み込まれます。
そのため、この時に更新されたインデックスのサンプリングは 100% で設定されています。
image

そのため、サンプリングの設定にもよると思いますが、インデックスの再構築後に手動や自動更新で統計情報が更新された場合は、サンプリング率が減っている可能性があるかもしれないですね。
#  サンプリングを 100% (FULLSCAN) にした場合、データの読み取りにはそれなりな時間がかかりますので、統計の更新はインデックスの再構築時に実施するという考え方もあるかと。

統計情報が更新されたタイミングとサンプリングを把握しておくとよいかもしれないかと思って軽くですがまとめてみました。
# 更新されたタイミングであれば、STATS_DATE (Transact-SQL) で見ることもできますね。

Share

Written by Masayuki.Ozawa

10月 21st, 2012 at 10:33 pm

Posted in SQL Server

Tagged with

One Response to '統計情報のサンプリングについて'

Subscribe to comments with RSS or TrackBack to '統計情報のサンプリングについて'.

  1. […] 統計情報のサンプリングについて […]

    統計情報の更新とサンプリングについて « SE の雑記

    10 2月 13 at 23:32

Leave a Reply