sys.dm_db_xtp_hash_index_stats (Transact-SQL)

gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Dessa statistik är användbara för att förstå och justera hinkräkningarna för hashindex i minnesoptimerade tabeller. Den kan också användas för att upptäcka fall där indexnyckeln har många dubbletter.

En stor genomsnittlig kedjelängd indikerar att många rader hashas till samma hink. Detta kan hända eftersom:

  • Om antalet tomma hinkar är lågt eller om medel- och maxkedjan är liknande, är det troligt att det totala antalet hinkar är för lågt. Detta gör att många olika indexnycklar hashar till samma hink.

  • Om antalet tomma hinkar är högt, eller om den maximala kedjelängden är hög i förhållande till den genomsnittliga kedjelängden, finns det två sannolika förklaringar. Det finns många rader med dubbletter av indexnyckelvärden, eller så finns det en skevhet i nyckelvärdena. I båda fallen hashar alla rader med samma indexnyckelvärde till samma hink, vilket leder till en lång kedjelängd i den hinken.

Långa kedjelängder kan avsevärt påverka prestandan för alla DML-operationer på enskilda rader, inklusive SELECT och INSERT. Korta kedjelängder tillsammans med ett högt tomt antal hinkar indikerar en bucket_count som är för hög. Detta minskar prestandan hos indexskanningar.

Varning

Detta DMV skannar hela bordet. Så om det finns stora tabeller i din databas sys.dm_db_xtp_hash_index_stats kan det ta lång tid.

För mer information, se Hashindex för Memory-Optimized tabeller.

Kolumnnamn Typ Description
object_id int Objekt-ID:t för modertabellen.
xtp_object_id bigint ID för den minnesoptimerade tabellen.
index_id int Index-ID:t.
total_bucket_count bigint Det totala antalet hashhinkar i indexet.
empty_bucket_count bigint Antalet tomma hashhinkar i indexet.
avg_chain_length bigint Den genomsnittliga längden på radkedjorna över alla hashhinkar i indexet.
max_chain_length bigint Den maximala längden på radkedjorna i hashhinkarna.
xtp_object_id bigint Det In-Memory OLTP-objekt-ID som motsvarar den minnesoptimerade tabellen.

Permissions

Kräver behörigheten VIEW DATABASE STATE (VISA DATABASTILLSTÅND) för databasen.

Behörigheter för SQL Server 2022 och senare

Kräver behörigheten VISA DATABASPRESTANDATILLSTÅND för databasen.

Examples

A. Felsök hashindex-bucket count

Följande fråga kan användas för att felsöka hashindexets hinkantal för en befintlig tabell. Frågan returnerar statistik om procentandelen tomma hinkar och kedjelängden för alla hashindex i användartabeller.

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

För detaljer om hur man tolkar resultaten av denna fråga, se Felsökning av hashindex för Memory-Optimized tabeller.

B. Hashindexstatistik för interna tabeller

Vissa funktioner använder interna tabeller som använder hashindex, till exempel kolumnlagringsindex på minnesoptimerade tabeller. Följande fråga ger statistik för hashindex på interna tabeller som är länkade till användartabeller.

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

Hinkräkningarna av index i interna tabeller kan inte ändras, därför bör utdata från denna fråga endast betraktas som informativ. Ingen åtgärd krävs.

Denna fråga förväntas inte returnera några rader om du inte använder en funktion som använder hashindex på interna tabeller. Följande minnesoptimerade tabell innehåller ett kolumnlagringsindex. Efter att ha skapat denna tabell kommer du att se hashindex på interna tabeller.

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