Sdílet prostřednictvím


sys.dm_db_xtp_hash_index_stats (Transact-SQL)

platí pro: SQL Server Azure SQL DatabaseAzure SQL Managed Instance

Tyto statistiky jsou užitečné pro pochopení a ladění počtu bucketů pro hash indexy v tabulkách optimalizovaných pro paměť. Lze jej také použít k detekci případů, kdy indexový klíč obsahuje mnoho duplikátů.

Velká průměrná délka řetězce znamená, že mnoho řádků je hashováno do stejného bucketu. To se může stát, protože:

  • Pokud je počet prázdných kbelíků nízký nebo jsou průměrná a maximální délka řetězce podobné, je pravděpodobné, že celkový počet kbelíků je příliš nízký. To způsobí, že mnoho různých indexových klíčů se hashuje do stejného bucketu.

  • Pokud je počet prázdných kbelíků vysoký, nebo maximální délka řetězce je vysoká vzhledem k průměrné délce řetězce, existují dvě pravděpodobná vysvětlení. Existuje mnoho řádků s duplicitními indexovými hodnotami klíčů, nebo je v nich zkresleno. V obou případech všechny řádky se stejným indexem klíče a hodnotou hashují do stejného bucketu, což vede k dlouhé délce řetězce v tomto bucketu.

Dlouhé délky řetězců mohou výrazně ovlivnit výkon všech DML operací na jednotlivých řádcích, včetně SELECT a .INSERT Krátké délky řetězu spolu s vysokým počtem prázdných kbelíků naznačují, že bucket_count je příliš vysoká. To snižuje výkon indexových skenů.

Výstraha

Toto DMV prohledává celý stůl. Pokud máte v databázi velké tabulky, může to sys.dm_db_xtp_hash_index_stats trvat dlouho.

Pro více informací viz Hash Indexes for Memory-Optimized Tables.

Název sloupce Typ Description
object_id int Objektové ID nadřazené tabulky.
xtp_object_id bigint ID tabulky optimalizované pro paměť.
index_id int The index ID.
total_bucket_count bigint Celkový počet hash bucketů v indexu.
empty_bucket_count bigint Počet prázdných hashovacích bucketů v indexu.
avg_chain_length bigint Průměrná délka řetězců řádků přes všechny hashovací buckety v indexu.
max_chain_length bigint Maximální délka řetězců řádků v hashovacích kbelících.
xtp_object_id bigint Identifikátor objektu In-Memory OLTP, který odpovídá tabulce optimalizované pro paměť.

Povolení

Vyžaduje oprávnění ZOBRAZIT STAV DATABÁZE k databázi.

Oprávnění pro SQL Server 2022 a novější

Vyžaduje oprávnění ZOBRAZIT STAV VÝKONU DATABÁZE pro databázi.

Examples

A. Řešení problémů hash indexu v koši

Následující dotaz lze použít k řešení problémů s počtem hash indexových bucketů v existující tabulce. Dotaz vrací statistiky o procentu prázdných bucketů a délce řetězce pro všechny hash indexy v uživatelských tabulkách.

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

Podrobnosti o interpretaci výsledků tohoto dotazu najdete v článku Troubleshooting Hash Indexes for Memory-Optimized Tables.

B. Statistiky hashovacího indexu pro interní tabulky

Některé funkce používají interní tabulky, které používají hashovací indexy, například indexy columnstore v tabulkách optimalizovaných pro paměť. Následující dotaz vrací statistiky hash indexů v interních tabulkách, které jsou propojeny s uživatelskými tabulkami.

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

Počty indexů v kbelích v interních tabulkách nelze měnit, proto by výstup tohoto dotazu měl být považován pouze za informativní. Není vyžadována žádná akce.

Tento dotaz by neměl vrátit žádné řádky, pokud nepoužíváte funkci, která používá hash indexy v interních tabulkách. Následující tabulka optimalizovaná pro paměť obsahuje index columnstore. Po vytvoření této tabulky uvidíte hash indexy v interních tabulkách.

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