ที่เก็บข้อมูลดัชนีแบบไม่คลัสเตอร์บนเสาหลักแบบคลัสเตอร์


18

ใน SQL Server ดัชนี nonclustered ที่ไม่ซ้ำกันในตารางrowstoreประกอบด้วยที่คั่นหน้าของวัตถุฐาน(RID หรือคีย์การทำคลัสเตอร์) ที่ทุกระดับของโครงสร้างดัชนีที่ไม่เป็นคลัสเตอร์ บุ๊กมาร์กจะถูกจัดเก็บเป็นส่วนหนึ่งของคีย์ดัชนีที่ไม่เป็นคลัสเตอร์ในทุกระดับดัชนี

ในทางตรงกันข้ามถ้าดัชนี nonclustered เป็นที่ไม่ซ้ำกันที่คั่นเป็นปัจจุบันเท่านั้นที่ใบระดับของดัชนี - ไม่ได้เป็นส่วนหนึ่งของคีย์ (บุ๊กเป็นปัจจุบันเป็นหนึ่งหรือคอลัมน์รวมมากขึ้นในผล)

ใน SQL Server 2016 เป็นไปได้ที่จะสร้างดัชนี b-tree แบบ nonclustered บนตารางเชิงคอลัมน์ (อันที่มีดัชนี columnstore แบบคลัสเตอร์)

  1. อะไรคือ 'บุ๊คมาร์ค' ที่ใช้สำหรับดัชนี b-tree แบบไม่คลัสเตอร์บนตาราง columnstore แบบคลัสเตอร์
  2. ความแตกต่างระหว่างดัชนีที่ไม่ซ้ำแบบไม่เจาะจงและไม่ซ้ำแบบคลัสเตอร์ที่อธิบายไว้ข้างต้นยังคงมีผลอยู่หรือไม่?

คำตอบ:


17
  1. "บุ๊กมาร์ก" คือตัวระบุตำแหน่งดั้งเดิมของดัชนีคอลัมน์ (ต่อ "Pro SQL Server Internals" โดย Dmitri Korotkevitch) นี่คือค่า 8 ไบต์โดยมีดัชนี columnstore row_group_idใน 4 ไบต์แรกและ offset ใน 4 ไบต์ที่สอง

  2. หากคุณใช้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;

ผลลัพธ์คือ:

ดัชนีที่ไม่ซ้ำ

ดัชนี Nonunqiue

โครงสร้างทั้งสองมีขนาดแถวเดียวกันที่ระดับลีฟ แต่ดัชนีที่ไม่เป็นเอกสิทธิ์คือไม่ใช่ 12 ไบต์ที่ใหญ่กว่าดัชนี nonclustered ที่ไม่ซ้ำกันในระดับที่ไม่ใช่ลีฟเนื่องจากตำแหน่ง locater คอลัมน์ 8 ไบต์บวก 4 ไบต์ของตัวแปรแรก - ความยาวคอลัมน์ในแถว (uniquifier คือความยาวตัวแปร)


แล้วถ้าแถวที่เกี่ยวข้องอยู่ในร้านเดลต้าล่ะ? จะเกิดอะไรขึ้นเมื่อมีการบีบอัดที่จัดเก็บเดลต้า
Artashes Khachatryan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.