Lưu trữ chỉ mục không bao gồm trên kho cột


18

Trong SQL Server, một chỉ số nonclustered không duy nhất trên rowstore bảng kết hợp các đối tượng cơ sở của bookmark (RID hoặc phân nhóm chính) tại tất cả các cấp của cấu trúc chỉ số nonclustered. Dấu trang được lưu trữ như một phần của khóa chỉ mục không bao gồm ở tất cả các cấp chỉ mục.

Mặt khác, nếu chỉ mục không bao gồm là duy nhất , dấu trang chỉ hiện diện ở cấp độ của chỉ mục - không phải là một phần của khóa (dấu trang hiện diện dưới dạng một hoặc nhiều cột được bao gồm).

Trong SQL Server 2016, có thể xây dựng một chỉ mục cây b không bao gồm trên một bảng hướng theo cột (một bảng có chỉ mục kho lưu trữ cột).

  1. 'Dấu trang' được sử dụng cho chỉ mục b-cây không bao gồm trên bảng cột phân cụm là gì?
  2. Các khác biệt giữa các chỉ mục không bao gồm duy nhất và không duy nhất được mô tả ở trên có còn được áp dụng không?

Câu trả lời:


17
  1. "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_idcột trong 4 byte đầu tiên và phần bù trong 4 byte thứ hai.

  2. 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à:

Chỉ số duy nhất

Chỉ số phiunue

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).


Và nếu hàng tương ứng nằm trong cửa hàng delta thì sao? Điều gì xảy ra khi cửa hàng delta đang bị nén?
Artash Khachatryan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.