Delen via


sys.dm_db_xtp_hash_index_stats (Transact-SQL)

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Deze statistieken zijn nuttig om het aantal buckets voor hashindexen in geheugengeoptimaliseerde tabellen te begrijpen en af te stemmen. Het kan ook worden gebruikt om gevallen te detecteren waarin de indexsleutel veel duplicaten bevat.

Een grote gemiddelde ketenlengte geeft aan dat veel rijen naar dezelfde bucket worden gehasht. Dit kan gebeuren omdat:

  • Als het aantal lege emmers laag is of de gemiddelde en maximale ketenlengtes vergelijkbaar zijn, is het waarschijnlijk dat het totale aantal bakken te laag is. Dit zorgt ervoor dat veel verschillende indexsleutels naar dezelfde bucket hashen.

  • Als het aantal lege emmers hoog is, of de maximale kettinglengte hoog is ten opzichte van de gemiddelde ketenlengte, zijn er twee waarschijnlijke verklaringen. Er zijn veel rijen met dubbele indexsleutelwaarden, of er is een scheefheid in de sleutelwaarden. In beide gevallen hashen alle rijen met dezelfde indexsleutelwaarde naar dezelfde bucket, wat leidt tot een lange ketenlengte in die bucket.

Lange ketenlengtes kunnen de prestaties van alle DML-bewerkingen op individuele rijen aanzienlijk beïnvloeden, inclusief SELECT en INSERT. Korte kettinglengtes samen met een hoog aantal lege emmers wijzen op een te hoge bucket_count. Dit vermindert de prestaties van indexscans.

Waarschuwing

Deze DMV scant de hele tafel. Dus als er grote tabellen in je database staan, kan dat sys.dm_db_xtp_hash_index_stats lang duren.

Voor meer informatie, zie Hashindexen voor Memory-Optimized tabellen.

Kolomnaam Typologie Description
object_id int De object-ID van de oudertabel.
xtp_object_id bigint ID van de geheugengeoptimaliseerde tabel.
index_id int De index-ID.
total_bucket_count bigint Het totale aantal hash buckets in de index.
empty_bucket_count bigint Het aantal lege hashemmers in de index.
avg_chain_length bigint De gemiddelde lengte van de rijketens over alle hash buckets in de index.
max_chain_length bigint De maximale lengte van de rijketens in de hashemmers.
xtp_object_id bigint De In-Memory OLTP-object-ID die overeenkomt met de geheugengeoptimaliseerde tabel.

Permissions

Vereist de machtiging VIEW DATABASE STATE voor de database.

Machtigingen voor SQL Server 2022 en hoger

Hiervoor is de machtiging VIEW DATABASE PERFORMANCE STATE vereist voor de database.

Voorbeelden

Eén. Troubleshoot hashindex bucket count

De volgende query kan worden gebruikt om het aantal buckets van de hashindex van een bestaande tabel te onderzoeken. De query levert statistieken op over het percentage lege buckets en de ketenlengte voor alle hashindexen in gebruikerstabellen.

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

Voor details over hoe de resultaten van deze query te interpreteren, zie Troubleshooting Hash Indexes for Memory-Optimized Tables.

B. Hashindexstatistieken voor interne tabellen

Bepaalde functies gebruiken interne tabellen die hashindexen gebruiken, bijvoorbeeld columnstore-indexen op geheugen-geoptimaliseerde tabellen. De volgende query levert statistieken op voor hashindexen op interne tabellen die gekoppeld zijn aan gebruikerstabellen.

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

De bucket counts van index in interne tabellen kunnen niet worden gewijzigd, dus de output van deze query moet alleen als informatief worden beschouwd. Er is geen actie vereist.

Deze query wordt niet verwacht om rijen terug te geven, tenzij je een functie gebruikt die hashindexen gebruikt op interne tabellen. De volgende geheugengeoptimaliseerde tabel bevat een kolomstore-index. Na het aanmaken van deze tabel zie je hashindexen op interne tabellen.

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