sys.dm_db_xtp_hash_index_stats (T-SQL)

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure 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);