RCSI対応のデータベースがあり、覚えている限りオンライン(SQL 2014 Enterprise)でインデックスを再構築しています。インデックスをオフラインで再構築すると、追加の14バイトが失われると私は理解しています。ただし、オンラインで再構築または再編成を続ける限り、1行あたり14バイトを保持します。あれは正しいですか?
ただし、オンラインで再構築または再編成を続ける限り、1行あたり14バイトを保持します。あれは正しいですか?
これは本当です。 REBUILD WITH (ONLINE = ON)
およびREORGANIZE
は、14バイトをそのままにします。通常のREBUILD
はそれをクリアします。
RCSIを無効にすると、14バイトのバージョンタグは、言及した3つの操作のいずれかによってクリアされます。
REBUILD
REBUILD WITH (ONLINE = ON)
REORGANIZE
将来の参考のために、これを自分でテストすることはそれほど難しくありません。データベースとテーブルを作成し、さまざまな操作を試し、そのたびに行サイズを確認してください。
USE [master];
GO
CREATE DATABASE AreSeaEssEye;
GO
USE [AreSeaEssEye];
GO
CREATE TABLE dbo.Foo (c1 INT NOT NULL);
INSERT INTO dbo.Foo (c1) VALUES (1);
ALTER TABLE dbo.Foo ADD CONSTRAINT PK_Foo PRIMARY KEY (c1);
-- Baseline (11)
select max_record_size_in_bytes from sys.dm_db_index_physical_stats (db_id('AreSeaEssEye'), object_id('AreSeaEssEye.dbo.Foo'), null, null, 'DETAILED');
ALTER DATABASE AreSeaEssEye SET ALLOW_SNAPSHOT_ISOLATION ON;
UPDATE dbo.Foo SET c1 = 2;
-- After enabling RCSI and updating (25)
select max_record_size_in_bytes from sys.dm_db_index_physical_stats (db_id('AreSeaEssEye'), object_id('AreSeaEssEye.dbo.Foo'), null, null, 'DETAILED');
ALTER INDEX PK_Foo ON dbo.Foo REBUILD WITH (ONLINE = ON);
-- After online rebuild (still 25)
select max_record_size_in_bytes from sys.dm_db_index_physical_stats (db_id('AreSeaEssEye'), object_id('AreSeaEssEye.dbo.Foo'), null, null, 'DETAILED');
ALTER INDEX PK_Foo ON dbo.Foo REORGANIZE;
-- After reorg (still 25)
select max_record_size_in_bytes from sys.dm_db_index_physical_stats (db_id('AreSeaEssEye'), object_id('AreSeaEssEye.dbo.Foo'), null, null, 'DETAILED');
ALTER INDEX PK_Foo ON dbo.Foo REBUILD;
-- After normal rebuild (back to 11)
select max_record_size_in_bytes from sys.dm_db_index_physical_stats (db_id('AreSeaEssEye'), object_id('AreSeaEssEye.dbo.Foo'), null, null, 'DETAILED');
そして結果は?予想通り: