SQL Server 2012 におけるパーティションインデックス再構築時の統計情報更新

 

神谷 雅紀
SQL Server Escalation Engineer

 

 

DO's&DONT's #8: やってはいけないこと - インデックス再構築 (REBUILD) 後のインデックス統計情報更新 (UPDATE STATISTICS) でインデックス再構築後にインデックス統計情報の更新を行うとサンプル率が下がるという話をしました。

SQL Server 2012 においても、基本的には違いはないのですが、パーティションインデックスについては動作が異なります。

SQL Server 2012 のパーティションインデックスの再構築時の統計情報更新は、サンプル率 100% ではなく、UPDATE STATISTICS に明示的なサンプル率が指定されない時に使用されるサンプル率と同じ方法で決定されたサンプル率 (データ量を基に計算されたサンプル率) が使用されます。そのため、SQL Server 2012 のパーティションインデックスについては、インデックス再構築後にインデックス統計情報を更新しても、統計情報更新を二度行うという点では無駄ではあるものの、以前のバージョンのように、サンプル率を大幅に低下させるということはありません。反対に、以前のバージョンと同じサンプル率 100% で統計情報を作成したい場合は、明示的に FULLSCAN オプションを指定した UPDAE STATISTICS を実行しなければならない場合があります。

 

これ自体は、Books Online CREATE INDEX, ALTER INDEX, データベースエンジン機能の動作変更に記載されている内容ですが、以前に関連する内容を書いていたため、改めて取り上げてみました。

 

以下は、簡単な動作確認用のスクリプトです。

 

CREATE DATABASE parttest
ON PRIMARY (NAME = partf0, FILENAME = N'C:\temp\partf0.mdf'),
FILEGROUP fg1 (NAME = partf1,FILENAME = N'C:\temp\partf1.mdf'),
FILEGROUP fg2 (NAME = partf2,FILENAME = N'C:\temp\partf2.mdf'),
FILEGROUP fg3 (NAME = partf3,FILENAME = N'C:\temp\partf3.mdf'),
FILEGROUP fg4 (NAME = partf4,FILENAME = N'C:\temp\partf4.mdf')
LOG ON (NAME = partlog,FILENAME = N'C:\temp\partlog.ldf')
GO

USE parttest
GO
CREATE PARTITION FUNCTION pf1 (int) AS RANGE LEFT FOR VALUES (100000, 200000, 300000)
GO
CREATE PARTITION SCHEME ps1 AS PARTITION pf1 TO (fg1, fg2, fg3, fg4)
GO
CREATE TABLE dbo.partt (c1 int not null, c2 nchar(100)) ON ps1(c1)
GO
ALTER TABLE dbo.partt ADD CONSTRAINT pk_partt PRIMARY KEY (c1)
GO

DECLARE @d int
SET @d = 0
BEGIN TRAN
WHILE @d < 400000
BEGIN
INSERT INTO dbo.partt VALUES (@d, cast(@d as nchar(6))+replicate(N'X',94))
SET @d+=1
END
COMMIT
GO

ALTER TABLE dbo.partt REBUILD
GO
DBCC SHOW_STATISTICS ([dbo.partt], pk_partt)
GO

 

※ パーティションインデックスは、Enterprise, Developer, Evaluation エディションのみで利用可能な機能です。