統計情報を更新、作成するときにサンプリングレートを指定しないと既定のサンプリングが設定されます。
UPDATE STATISTICS (Transact-SQL)
統計
現在設定されている統計情報がどの程度のサンプリングで作成されているか確認するための方法をすこしまとめてみたいと思います。
■統計情報のサンプリングの確認
現在作成されている統計情報のサンプリングですが、DBCC SHOWSTATISTICS で確認することができます。
# STAT_HEADER を設定することで、サンプリングが含まれているヘッダー情報だけを表示することができます。
実行結果の [Rows] と [Rows Sampled] を確認することで全体行に対してどれくらいのサンプリングで統計情報が作成されたかを確認することができます。
DBCC コマンドで取得しているので、全統計のサンプリングを取得するためにはカーソル等で統計情報の一覧から DBCC コマンドを実行する必要があるかと思います。
DECLARE @sql nvarchar(max) = N’DBCC SHOW_STATISTICS (”@1”, ”@2”) WITH STAT_HEADER’ DECLARE @Table sysname, @Schema sysname, @Stats sysname DECLARE StatsCursor CURSOR FORWARD_ONLY FOR OPEN StatsCursor FETCH NEXT FROM StatsCursor WHILE @@FETCH_STATUS = 0 SET @execsql = REPLACE(REPLACE(@sql, ‘@1’, @Schema + ‘.’ + @Table), ‘@2’, @Stats) DEALLOCATE StatsCursor |
SQL Server 2008 R2 SP2 / SQL Server 2012 SP1 以降であれば、sys.dm_db_stats_properties (Transact-SQL) で表形式で取得することもできます。
SELECT |
sp_updatestats や UPDATE STATISTICS (Transact-SQL) を使用した場合は、通常既定のサンプリングが使用されます。
統計情報の更新は自動更新 / 手動更新のほかに、インデックスを再構築 (REBUILD) した際にも実行されます。
インデックスの再構築を実行した場合は、インデックス列をすべて読み込まれます。
そのため、この時に更新されたインデックスのサンプリングは 100% で設定されています。
そのため、サンプリングの設定にもよると思いますが、インデックスの再構築後に手動や自動更新で統計情報が更新された場合は、サンプリング率が減っている可能性があるかもしれないですね。
# サンプリングを 100% (FULLSCAN) にした場合、データの読み取りにはそれなりな時間がかかりますので、統計の更新はインデックスの再構築時に実施するという考え方もあるかと。
統計情報が更新されたタイミングとサンプリングを把握しておくとよいかもしれないかと思って軽くですがまとめてみました。
# 更新されたタイミングであれば、STATS_DATE (Transact-SQL) で見ることもできますね。
[…] 統計情報のサンプリングについて […]
統計情報の更新とサンプリングについて « SE の雑記
10 2月 13 at 23:32