SQL Serverは重複する行を格納する代わりにポインターを使用しますか?
SQL Serverのバージョンとデータ圧縮オプションによって異なります。
- SQL Server 2008以降、行またはページレベルでの圧縮オプションがあります。
- ページレベルの圧縮では、圧縮に多くのアルゴリズム/手法が使用されます。あなたの質問(重複データのポインター)に関して、ページ圧縮は(また) 接頭辞圧縮と辞書圧縮を使用します:
プレフィックス圧縮 [...]列内の繰り返されるプレフィックス値は、対応するプレフィックスへの参照で置き換えられます[...]
辞書圧縮プレフィックス圧縮が完了した後、辞書圧縮が適用されます。辞書圧縮は、ページ上の任意の場所で繰り返し値を検索し、CI領域に格納します。接頭辞圧縮とは異なり、辞書圧縮は1つの列に制限されません。辞書圧縮は、ページのどこにでも出現する繰り返し値を置き換えることができます。次の図は、辞書圧縮後の同じページを示しています。
したがって、プレフィックスとディクショナリの圧縮(ページ圧縮)の場合、SQL Serverはポインターを使用して (部分的または完全に)重複した値(重複した行ではない)を同じ列またはdiff内に格納します。列。
CREATE DATABASE TestComp;
GO
USE TestComp;
GO
CREATE TABLE Person1 (
PersonID INT IDENTITY PRIMARY KEY,
FirstName NVARCHAR(100) NOT NULL,
LastName NVARCHAR(100) NOT NULL
);
GO
DECLARE
@f NVARCHAR(100) = REPLICATE('A',100),
@l NVARCHAR(100) = REPLICATE('B',100);
INSERT Person1 (FirstName, LastName)
VALUES (@f, @l);
GO 1000
CREATE TABLE Person2 (
PersonID INT IDENTITY PRIMARY KEY,
FirstName NVARCHAR(100) NOT NULL,
LastName NVARCHAR(100) NOT NULL
);
GO
ALTER TABLE Person2
REBUILD
WITH (DATA_COMPRESSION=PAGE);
GO
DECLARE
@f NVARCHAR(100) = REPLICATE('A',100),
@l NVARCHAR(100) = REPLICATE('B',100);
INSERT Person2 (FirstName, LastName)
VALUES (@f, @l);
GO 1000
SELECT f.page_count AS PageCount_Person1_Uncompressed
FROM sys.dm_db_index_physical_stats(DB_ID(), OBJECT_ID('Person1'), 1, DEFAULT, DEFAULT) f
SELECT f.page_count AS PageCount_Person2_Compressed
FROM sys.dm_db_index_physical_stats(DB_ID(), OBJECT_ID('Person2'), 1, DEFAULT, DEFAULT) f
GO
結果:
PageCount_Person1_Uncompressed
------------------------------
53
PageCount_Person2_Compressed
----------------------------
2