Verwendet SQL Server Zeiger, anstatt doppelte Zeilen zu speichern?
Dies hängt von der Version und den Datenkomprimierungsoptionen von SQL Server ab:
- Ab SQL Server 2008 gibt es eine Komprimierungsoption auf Zeilen- oder Seitenebene.
- Die Komprimierung auf Seitenebene verwendet viele Algorithmen / Techniken zur Komprimierung. In Bezug auf Ihre Frage (Zeiger auf doppelte Daten) verwendet die Seitenkomprimierung (auch) die Präfixkomprimierung und die Wörterbuchkomprimierung :
Prefix Compression [...] Die wiederholten prefix Werte in der Spalte durch einen Verweis auf den entsprechenden Präfix ersetzt sind , [...]
Wörterbuchkomprimierung Nach Abschluss der Präfixkomprimierung wird die Wörterbuchkomprimierung angewendet. Die Wörterbuchkomprimierung sucht überall auf der Seite nach wiederholten Werten und speichert sie im CI-Bereich. Im Gegensatz zur Präfixkomprimierung ist die Wörterbuchkomprimierung nicht auf eine Spalte beschränkt. Die Wörterbuchkomprimierung kann wiederholte Werte ersetzen, die an einer beliebigen Stelle auf einer Seite auftreten. Die folgende Abbildung zeigt dieselbe Seite nach der Wörterbuchkomprimierung.
Für die Präfix- und Wörterbuchkomprimierung (Seitenkomprimierung) verwendet SQL Server Zeiger, um (teilweise oder vollständig) doppelte Werte (keine doppelten Zeilen) in derselben Spalte oder in diff zu speichern . Säulen.
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
Ergebnisse:
PageCount_Person1_Uncompressed
------------------------------
53
PageCount_Person2_Compressed
----------------------------
2