"บุ๊กมาร์ก" คือตัวระบุตำแหน่งดั้งเดิมของดัชนีคอลัมน์ (ต่อ "Pro SQL Server Internals" โดย Dmitri Korotkevitch) นี่คือค่า 8 ไบต์โดยมีดัชนี columnstore row_group_id
ใน 4 ไบต์แรกและ offset ใน 4 ไบต์ที่สอง
หากคุณใช้DBCC PAGE
เพื่อดูดัชนีที่ไม่ทำคลัสเตอร์ตัวระบุตำแหน่งดัชนีคอลัมน์ 8 ไบต์แบบดั้งเดิมจะปรากฏในคอลัมน์ "uniquifier" ของDBCC PAGE
เอาต์พุต สิ่งนี้แสดงให้เห็นว่าดัชนีที่ไม่เป็นคลัสเตอร์ที่ไม่ซ้ำกันไม่จำเป็นต้องรวม locator แถว columnstore ในขณะที่ดัชนีที่ไม่ใช่แบบคลัสเตอร์ที่ไม่ซ้ำกันทำ
รหัสต่อไปนี้สร้างตารางที่จัดระเบียบแบบจัดเรียงคอลัมน์ที่มีดัชนีที่ไม่ซ้ำกันและไม่ซ้ำกันของ b-tree บนคอลัมน์เดียวกัน:
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);
เราสามารถดูขนาดของแถวดัชนีในระดับต่างๆของ b-tree โดยใช้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;
ผลลัพธ์คือ:
โครงสร้างทั้งสองมีขนาดแถวเดียวกันที่ระดับลีฟ แต่ดัชนีที่ไม่เป็นเอกสิทธิ์คือไม่ใช่ 12 ไบต์ที่ใหญ่กว่าดัชนี nonclustered ที่ไม่ซ้ำกันในระดับที่ไม่ใช่ลีฟเนื่องจากตำแหน่ง locater คอลัมน์ 8 ไบต์บวก 4 ไบต์ของตัวแปรแรก - ความยาวคอลัมน์ในแถว (uniquifier คือความยาวตัวแปร)