SQL Server có sử dụng con trỏ thay vì lưu trữ các hàng trùng lặp không?
Nó phụ thuộc vào các tùy chọn nén dữ liệu và phiên bản của SQL Server:
- Bắt đầu từ SQL Server 2008, có một tùy chọn nén ở cấp hàng hoặc trang.
- Nén cấp độ trang sử dụng nhiều thuật toán / kỹ thuật để nén. Về câu hỏi của bạn (con trỏ cho dữ liệu trùng lặp), nén trang sử dụng (cũng) nén tiền tố và nén từ điển :
Nén tiền tố [...] Các giá trị tiền tố lặp lại trong cột được thay thế bằng tham chiếu đến tiền tố tương ứng [...]
Nén từ điển Sau khi nén tiền tố đã hoàn tất, nén từ điển được áp dụng. Nén từ điển tìm kiếm các giá trị lặp lại ở bất cứ đâu trên trang và lưu trữ chúng trong khu vực CI. Không giống như nén tiền tố, nén từ điển không bị hạn chế trong một cột. Nén từ điển có thể thay thế các giá trị lặp lại xảy ra ở bất cứ đâu trên một trang. Hình minh họa sau đây cho thấy cùng một trang sau khi nén từ điển.
Vì vậy, để nén tiền tố và từ điển (nén trang), SQL Server sử dụng các con trỏ để lưu trữ (một phần hoặc toàn bộ) các giá trị trùng lặp (không phải các hàng trùng lặp) trong cùng một cột hoặc trong diff. cột.
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
Các kết quả:
PageCount_Person1_Uncompressed
------------------------------
53
PageCount_Person2_Compressed
----------------------------
2