Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:SQL Server
Azure SQL Database
Azure 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);
Verwante inhoud
- Inleiding tot Memory-Optimized tabellen
- Memory-Optimized Dynamische Beheerweergaven van tabellen
- SQL Server en Azure SQL indexarchitectuur en ontwerpgids: Richtlijnen voor het ontwerp van hashindexen
- In-Memory OLTP Overzicht en Gebruiksscenario's
- Probleemoplossing voor hashindexen voor Memory-Optimized tabellen
- Prestaties optimaliseren met behulp van in-memory technologieën in Azure SQL Database
- Prestaties optimaliseren met behulp van in-memory technologieën in Azure SQL Managed Instance