Aracılığıyla paylaş


sys.dm_db_xtp_hash_index_stats (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen Örneği

Bu istatistikler, bellek optimize edilmiş tablolarda hash indeksleri için bucket sayılarını anlamak ve ayarlamak için faydalıdır. Ayrıca, indeks anahtarının çok sayıda kopyası olduğu durumları tespit etmek için de kullanılabilir.

Büyük ortalama zincir uzunluğu, birçok satırın aynı kovaya hash edildiğini gösterir. Bu nedenlerle olabilir:

  • Boş kovaların sayısı azsa veya ortalama ve maksimum zincir uzunlukları benzerse, toplam kova sayısının çok düşük olması muhtemeldir. Bu durum, birçok farklı indeks anahtarının aynı kovaya hash etmesine neden olur.

  • Boş kovaların sayısı yüksekse veya maksimum zincir uzunluğu ortalama zincir uzunluğuna göre yüksekse, iki olası açıklama vardır. Birçok satır yuptanmış endeks anahtar değeri vardır veya anahtar değerlerde bir eğri vardır. Her iki durumda da, aynı endeks anahtar değerine sahip tüm satırlar aynı kovaya hash edilir ve bu da o kovada uzun bir zincir uzunluğuna yol açar.

Uzun zincir uzunlukları, ve dahil olmak üzere bireysel SELECTINSERTsatırlardaki tüm DML işlemlerinin performansını önemli ölçüde etkileyebilir. Kısa zincir uzunlukları ve yüksek boş kova sayısı, bucket_count çok yüksek olduğunu gösterir. Bu durum, indeks taramalarının performansını düşürür.

Uyarı

Bu DMV tüm tabloyu tarıyor. Yani, veritabanınızda büyük tablolar varsa, sys.dm_db_xtp_hash_index_stats bu uzun zaman alabilir.

Daha fazla bilgi için bkz. Memory-Optimized Tablolar için Hash Indexes.

Sütun adı Türü Description
object_id int Ebeveyn tablonun nesne kimliği.
xtp_object_id bigint Bellek optimize edilmiş tablonun ID'si.
index_id int Indeks ID.
total_bucket_count bigint Indeksteki toplam hash kovası sayısı.
empty_bucket_count bigint Indeksteki boş hash kovalarının sayısı.
avg_chain_length bigint Indeksteki tüm hash kovaları üzerindeki sıralı zincirlerin ortalama uzunluğu.
max_chain_length bigint Hash kovalarındaki sıra zincirlerinin maksimum uzunluğu.
xtp_object_id bigint In-Memory OLTP nesne kimliği, bellek optimize edilmiş tabloya karşılık gelir.

Permissions

Veritabanında VIEW DATABASE STATE izni gerektirir.

SQL Server 2022 ve üzeri için izinler

Veritabanında veritabanı performans durumunu görüntüleme izni gerektirir.

Örnekler

A. Sorun gideri hash index bucket sayısı

Aşağıdaki sorgu, mevcut bir tablonun hash index bucket sayısını sorun gidermek için kullanılabilir. Sorgu, kullanıcı tablolarındaki tüm hash indeksleri için boş kovaların yüzdesi ve zincir uzunluğu hakkında istatistikler getirir.

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

Bu sorgu sonuçlarının nasıl yorumlanacağına dair detaylar için Troubleshooting Troubleshooting Hash Indexes for Memory-Optimized Tables bölümüne bakınız.

B. İç tablolar için hash index istatistikleri

Bazı özellikler, örneğin bellek optimize edilmiş tablolarda columnstore indeksleri gibi hash indeksleri kullanan dahili tablolar kullanır. Aşağıdaki sorgu, kullanıcı tablolarına bağlı olan iç tablolardaki hash indekslerinin istatistiklerini döndürür.

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

İç tablolardaki indeks sayıları değiştirilemez, bu nedenle bu sorgunun çıktısı yalnızca bilgilendirici olarak kabul edilmelidir. Eylem gerekmez.

Bu sorgu, dahili tablolarda hash indeksleri kullanan bir özellik kullanıyorsanız satır döndürmesi beklenmez. Aşağıdaki bellek optimize edilmiş tablo, bir columnstore indeksi içerir. Bu tabloyu oluşturduktan sonra, dahili tablolarda hash indekslerini göreceksiniz.

  CREATE TABLE dbo.table_columnstore
  (
      c1 INT NOT NULL PRIMARY KEY NONCLUSTERED,
      INDEX ix_columnstore CLUSTERED COLUMNSTORE
  ) WITH (MEMORY_OPTIMIZED=ON);