sys.dm_db_xtp_hash_index_stats (T-SQL)
Berlaku untuk: SQL ServerAzure SQL Database Azure SQL Managed Instance
Statistik ini berguna untuk memahami dan menyetel jumlah wadah untuk indeks hash dalam tabel yang dioptimalkan memori. Ini juga dapat digunakan untuk mendeteksi kasus di mana kunci indeks memiliki banyak duplikat.
Panjang rantai rata-rata besar menunjukkan bahwa banyak baris di-hash ke wadah yang sama. Ini bisa terjadi karena:
Jika jumlah wadah kosong rendah atau rata-rata dan panjang rantai maksimum serupa, kemungkinan jumlah wadah total terlalu rendah. Ini menyebabkan banyak kunci indeks yang berbeda untuk hash ke wadah yang sama.
Jika jumlah wadah kosong tinggi, atau panjang rantai maksimum relatif tinggi terhadap panjang rantai rata-rata, ada dua kemungkinan penjelasan. Ada banyak baris dengan nilai kunci indeks duplikat, atau ada ke condong dalam nilai kunci. Dalam kedua kasus, semua baris dengan hash nilai kunci indeks yang sama ke wadah yang sama, yang mengarah ke panjang rantai panjang dalam wadah tersebut.
Panjang rantai panjang dapat secara signifikan memengaruhi performa semua operasi DML pada baris individual, termasuk SELECT
dan INSERT
. Panjang rantai pendek bersama dengan jumlah wadah kosong yang tinggi menunjukkan bucket_count yang terlalu tinggi. Ini mengurangi performa pemindaian indeks.
Peringatan
DMV ini memindai seluruh tabel. Jadi, jika ada tabel besar dalam database Anda, sys.dm_db_xtp_hash_index_stats
mungkin perlu waktu lama.
Untuk informasi selengkapnya, lihat Indeks Hash untuk Tabel yang Dioptimalkan Memori.
Nama kolom | Tipe | Deskripsi |
---|---|---|
object_id | int | ID objek tabel induk. |
xtp_object_id | bigint | ID tabel yang dioptimalkan memori. |
index_id | int | ID indeks. |
total_bucket_count | bigint | Jumlah total wadah hash dalam indeks. |
empty_bucket_count | bigint | Jumlah wadah hash kosong dalam indeks. |
avg_chain_length | bigint | Panjang rata-rata rantai baris di semua wadah hash dalam indeks. |
max_chain_length | bigint | Panjang maksimum rantai baris dalam wadah hash. |
xtp_object_id | bigint | ID objek OLTP Dalam Memori yang sesuai dengan tabel yang dioptimalkan memori. |
Izin
Memerlukan izin TAMPILKAN STATUS DATABASE pada database.
Izin untuk SQL Server 2022 dan yang lebih baru
Memerlukan izin TAMPILKAN STATUS PERFORMA DATABASE pada database.
Contoh
J. Memecahkan masalah jumlah wadah indeks hash
Kueri berikut dapat digunakan untuk memecahkan masalah jumlah wadah indeks hash dari tabel yang sudah ada. Kueri mengembalikan statistik tentang persentase wadah kosong dan panjang rantai untuk semua indeks hash pada tabel pengguna.
SELECT
QUOTENAME(SCHEMA_NAME(t.schema_id)) + N'.' + QUOTENAME(OBJECT_NAME(h.object_id)) as [table],
i.name as [index],
h.total_bucket_count,
h.empty_bucket_count,
FLOOR((
CAST(h.empty_bucket_count as float) /
h.total_bucket_count) * 100)
as [empty_bucket_percent],
h.avg_chain_length,
h.max_chain_length
FROM sys.dm_db_xtp_hash_index_stats as h
INNER JOIN sys.indexes as i
ON h.object_id = i.object_id
AND h.index_id = i.index_id
INNER JOIN sys.memory_optimized_tables_internal_attributes ia ON h.xtp_object_id=ia.xtp_object_id
INNER JOIN sys.tables t on h.object_id=t.object_id
WHERE ia.type=1
ORDER BY [table], [index];
Untuk detail tentang cara menginterpretasikan hasil kueri ini, lihat Pemecahan Masalah Indeks Hash untuk Tabel yang Dioptimalkan Memori.
B. Statistik indeks hash untuk tabel internal
Fitur tertentu menggunakan tabel internal yang menggunakan indeks hash, misalnya indeks penyimpan kolom pada tabel yang dioptimalkan memori. Kueri berikut mengembalikan statistik untuk indeks hash pada tabel internal yang ditautkan ke tabel pengguna.
SELECT
QUOTENAME(SCHEMA_NAME(t.schema_id)) + N'.' + QUOTENAME(OBJECT_NAME(h.object_id)) as [user_table],
ia.type_desc as [internal_table_type],
i.name as [index],
h.total_bucket_count,
h.empty_bucket_count,
h.avg_chain_length,
h.max_chain_length
FROM sys.dm_db_xtp_hash_index_stats as h
INNER JOIN sys.indexes as i
ON h.object_id = i.object_id
AND h.index_id = i.index_id
INNER JOIN sys.memory_optimized_tables_internal_attributes ia ON h.xtp_object_id=ia.xtp_object_id
INNER JOIN sys.tables t on h.object_id=t.object_id
WHERE ia.type!=1
ORDER BY [user_table], [internal_table_type], [index];
Jumlah bucket indeks pada tabel internal tidak dapat diubah, sehingga output kueri ini harus dianggap informatif saja. Tidak diperlukan tindakan.
Kueri ini tidak diharapkan mengembalikan baris apa pun kecuali Anda menggunakan fitur yang menggunakan indeks hash pada tabel internal. Tabel yang dioptimalkan memori berikut berisi indeks penyimpan kolom. Setelah membuat tabel ini, Anda akan melihat indeks hash pada tabel internal.
CREATE TABLE dbo.table_columnstore
(
c1 INT NOT NULL PRIMARY KEY NONCLUSTERED,
INDEX ix_columnstore CLUSTERED COLUMNSTORE
) WITH (MEMORY_OPTIMIZED=ON);
Konten terkait
- Pengantar Tabel yang Dioptimalkan Memori
- Tampilan Manajemen Dinamis Tabel yang Dioptimalkan Memori
- Arsitektur dan panduan desain indeks SQL Server dan Azure SQL: Panduan desain indeks hash
- Gambaran Umum dan Skenario Penggunaan OLTP Dalam Memori
- Pemecahan Masalah Indeks Hash untuk Tabel yang Dioptimalkan Memori
- Mengoptimalkan performa dengan menggunakan teknologi dalam memori di Azure SQL Database
- Mengoptimalkan performa dengan menggunakan teknologi dalam memori di Azure SQL Managed Instance