web-dev-qa-db-ja.com

RCSIとインデックスのメンテナンス

RCSI対応のデータベースがあり、覚えている限りオンライン(SQL 2014 Enterprise)でインデックスを再構築しています。インデックスをオフラインで再構築すると、追加の14バイトが失われると私は理解しています。ただし、オンラインで再構築または再編成を続ける限り、1行あたり14バイトを保持します。あれは正しいですか?

5
nkdbajoe

ただし、オンラインで再構築または再編成を続ける限り、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');

そして結果は?予想通り:

screenshot of RCSI row version changes

8
Josh Darnell