Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
platí pro: SQL Server
Azure SQL Database
Azure 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);
Související obsah
- Úvod do tabulek optimalizovaných pro paměť
- Memory-Optimized Dynamické zobrazení správy tabulek
- Průvodce architekturou a návrhem SQL indexů SQL Server a Azure: Pokyny pro návrh hash indexů
- In-Memory Přehled a scénáře použití OLTP
- Řešení problémů s hash indexy pro Memory-Optimized tabulky
- Optimalizace výkonu pomocí technologií v paměti ve službě Azure SQL Database
- Optimalizace výkonu pomocí technologií v paměti ve službě Azure SQL Managed Instance