클러스터형 열 저장소의 비 클러스터형 인덱스 저장소


18

SQL Server에서 행 저장소 테이블의 고유하지 않은 비 클러스터형 인덱스 는 모든 수준의 비 클러스터형 인덱스 구조 에서 기본 개체의 책갈피 (RID 또는 클러스터링 키)를 통합합니다 . 북마크는 모든 인덱스 수준에서 비 클러스터형 인덱스 키의 일부로 저장됩니다 .

반면, 비 클러스터형 인덱스가 고유 하면 책갈피는 키의 일부가 아닌 인덱스 의 리프 수준 에만 존재합니다 (책갈피는 하나 이상의 포함 된 열로 표시됨).

SQL Server 2016에서는 열 지향 테이블 (클러스터 된 열 저장소 인덱스가있는 테이블)에 클러스터되지 않은 b- 트리 인덱스를 작성할 수 있습니다.

  1. 클러스터형 columnstore 테이블의 비 클러스터형 b- 트리 인덱스에 사용되는 '북마크'는 무엇입니까?
  2. 위에서 설명한 고유 한 비 클러스터형 인덱스와 다른 비 클러스터형 인덱스의 차이점이 여전히 적용됩니까?

답변:


17
  1. "책갈피"는 Dmitri Korotkevitch의 "Pro SQL Server Internals"에 따른 열 저장소 인덱스 원본 로케이터 입니다. 이 값은 8 바이트 값이며, row_group_id첫 번째 4 바이트 에는 columnstore 인덱스가 있고 두 번째 4 바이트에는 오프셋이 있습니다.

  2. DBCC PAGE비 클러스터형 인덱스를 보는 데 사용 하는 경우 8 바이트 columnstore 인덱스 원본 로케이터가 DBCC PAGE출력 의 "고유 자"열에 나타납니다 . 이는 고유 한 비 클러스터형 인덱스에 columnstore 행 로케이터를 포함 할 필요가없는 반면, 고유 하지 않은 비 클러스터형 인덱스에는 포함되지 않습니다.

다음 코드는 동일한 열에서 고유하고 고유하지 않은 b-tree 비 클러스터형 인덱스를 사용하여 columnstore 구성 테이블을 만듭니다.

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

우리는 sys.dm_db_index_physical_stats다음을 사용하여 b- 트리의 다른 레벨에서 인덱스 행의 크기를 볼 수 있습니다 .

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;

출력은 다음과 같습니다.

고유 인덱스

비유 엔 지수

두 구조 모두 리프 수준에서 동일한 행 크기를 갖지만 8 바이트 열 저장소 로케이터로 인해 리프가 아닌 수준에서 고유하지 않은 비 클러스터형 인덱스보다 12 바이트가 더 크고 첫 번째 변수에 대한 4 바이트의 오버 헤드 행의 길이 열 (고유자는 가변 길이)


해당 행이 델타 저장소에있는 경우 어떻게해야합니까? 델타 저장소를 압축하면 어떻게됩니까?
Artashes Khachatryan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.