"Dấu trang" là công cụ định vị ban đầu của chỉ mục nhà kho (theo "Nội bộ máy chủ Pro SQL" của Dmitri Korotkevitch). Đây là một giá trị 8 byte, với chỉ số của row_group_id
cột trong 4 byte đầu tiên và phần bù trong 4 byte thứ hai.
Nếu bạn sử dụng DBCC PAGE
để xem chỉ mục không được phân cụm, bộ định vị ban đầu của chỉ mục cột 8 byte xuất hiện trong cột "uniquifier" của DBCC PAGE
đầu ra. Điều này cho thấy rằng một chỉ mục không phân cụm duy nhất không cần bao gồm bộ định vị hàng của cột, trong khi đó một chỉ mục không phân cụm không duy nhất thì không.
Đoạn mã sau đây tạo một bảng được tổ chức theo cột với một chỉ mục không bao gồm b-cây duy nhất và không duy nhất trên cùng một cột:
CREATE TABLE dbo.Heapish
(
c1 bigint NOT NULL,
c2 bigint NOT NULL,
INDEX CCI_dbo_Heapish CLUSTERED COLUMNSTORE
);
GO
INSERT dbo.Heapish WITH (TABLOCKX)
(c1, c2)
SELECT TOP (1024 * 1024 * 8)
c1 = ROW_NUMBER() OVER
(ORDER BY C1.[object_id], C1.column_id),
c2 = ROW_NUMBER() OVER
(ORDER BY C1.[object_id], C1.column_id)
FROM master.sys.columns AS C1
CROSS JOIN master.sys.columns AS C2
ORDER BY
c1
OPTION (MAXDOP 1);
GO
CREATE UNIQUE NONCLUSTERED INDEX UNIQUE_c2 ON dbo.Heapish (c2) WITH (MAXDOP = 1);
CREATE NONCLUSTERED INDEX NONUNIQUE_c2 ON dbo.Heapish (c2) WITH (MAXDOP = 1);
Chúng ta có thể thấy kích thước của hàng chỉ mục ở các mức khác nhau của cây b bằng cách sử dụng sys.dm_db_index_physical_stats
:
SELECT
DDIPS.index_level,
DDIPS.page_count,
DDIPS.record_count,
DDIPS.min_record_size_in_bytes,
DDIPS.max_record_size_in_bytes
FROM sys.dm_db_index_physical_stats
(
DB_ID(),
OBJECT_ID(N'dbo.Heapish', N'U'),
INDEXPROPERTY(OBJECT_ID(N'dbo.Heapish', N'U'), N'UNIQUE_c2', 'IndexID'),
NULL, 'DETAILED'
) AS DDIPS;
SELECT
DDIPS.index_level,
DDIPS.page_count,
DDIPS.record_count,
DDIPS.min_record_size_in_bytes,
DDIPS.max_record_size_in_bytes
FROM sys.dm_db_index_physical_stats
(
DB_ID(),
OBJECT_ID(N'dbo.Heapish', N'U'),
INDEXPROPERTY(OBJECT_ID(N'dbo.Heapish', N'U'), N'NONUNIQUE_c2', 'IndexID'),
NULL, 'DETAILED'
) AS DDIPS;
Đầu ra là:
Cả hai cấu trúc có cùng kích thước hàng ở cấp độ lá, nhưng chỉ mục không bao gồm đơn vị lớn hơn 12 byte so với chỉ mục không bao gồm duy nhất ở cấp độ không có lá do bộ định vị cột 8 byte, cộng thêm 4 byte cho biến đầu tiên cột -length trong một hàng (uniquifier là chiều dài thay đổi).