Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
gäller för:SQL Server
Azure SQL Database
Azure 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);
Relaterat innehåll
- Introduktion till Memory-Optimized tabeller
- Memory-Optimized Tabelldynamiska hanteringsvyer
- SQL Server och Azure SQL indexarkitektur och designguide: Riktlinjer för design av hashindex
- In-Memory OLTP-översikt och användningsscenarier
- Felsökning av hashindex för Memory-Optimized tabeller
- Optimera prestanda med hjälp av minnesintern teknik i Azure SQL Database
- Optimera prestanda med hjälp av minnesintern teknik i Azure SQL Managed Instance