Penyimpanan indeks nonclustered pada toko kolom berkerumun

18

Dalam SQL Server, indeks nonclustered non-unik pada tabel rowstore menggabungkan bookmark objek dasar (RID atau kunci pengelompokan) di semua tingkat struktur indeks nonclustered. Bookmark disimpan sebagai bagian dari kunci indeks nonclustered di semua level indeks.

Di sisi lain, jika indeks nonclustered unik , bookmark hanya ada di tingkat daun indeks - bukan sebagai bagian dari kunci (bookmark hadir sebagai satu atau lebih kolom yang disertakan, berlaku).

Dalam SQL Server 2016, dimungkinkan untuk membangun indeks b-tree nonclustered pada tabel berorientasi kolom (yang memiliki indeks columnstore berkerumun).

  1. Apa 'bookmark' yang digunakan untuk indeks b-tree nonclustered pada tabel toko kolom berkerumun?
  2. Apakah perbedaan antara indeks unik dan non-unik yang dijelaskan di atas masih berlaku?
Paul White Reinstate Monica
sumber

Jawaban:

17
  1. "Bookmark" adalah locator asli indeks storestore (per "Pro SQL Server Internals" oleh Dmitri Korotkevitch). Ini adalah nilai 8-byte, dengan indeks kolomstore row_group_iddi 4-byte pertama dan offset di 4-byte kedua.

  2. Jika Anda menggunakan DBCC PAGEuntuk melihat indeks non-clustered, locator asli indexstore 8-byte kolom muncul di kolom "uniquifier" dari DBCC PAGEoutput. Ini menunjukkan bahwa indeks non-clustered unik tidak perlu menyertakan locator baris columnstore, sedangkan indeks non-clustered non-unik tidak.

Kode berikut ini membuat tabel yang diorganisir kolom toko dengan indeks b-tree b-tree yang unik dan tidak unik pada kolom yang sama:

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

Kita dapat melihat ukuran baris indeks pada berbagai tingkat b-tree menggunakan 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;

Outputnya adalah:

Indeks unik

Indeks tidak bersatu

Kedua struktur memiliki ukuran baris yang sama di tingkat daun, tetapi indeks nonclustered nonunique adalah 12 byte lebih besar dari indeks nonclustered unik di tingkat non-daun karena locator kolomstore 8-byte, ditambah 4 byte overhead untuk variabel pertama -panjang kolom dalam satu baris (uniquifier adalah panjang variabel).

AMtwo
sumber
Dan bagaimana jika baris yang sesuai ada di toko delta? Apa yang terjadi ketika toko delta dikompresi?
Artashes Khachatryan