Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Statystyki te są przydatne do zrozumienia i dostrojenia liczby bucket dla indeksów hash w tabelach zoptymalizowanych pod pamięć. Może być również używany do wykrywania przypadków, gdy klucz indeksowy zawiera wiele duplikatów.
Duża średnia długość łańcucha wskazuje, że wiele wierszy jest hashowanych do tego samego kubełka. Może się to zdarzyć, ponieważ:
Jeśli liczba pustych wiadeczek jest niska lub średnia i maksymalna długość łańcucha są podobne, prawdopodobnie całkowita liczba kubełków jest zbyt niska. Powoduje to, że wiele różnych kluczy indeksowych haszuje do tego samego kubełka.
Jeśli liczba pustych kubełek jest wysoka, a maksymalna długość łańcucha duża względem średniej długości łańcucha, istnieją dwa prawdopodobne wyjaśnienia. Jest wiele wierszy z duplikatami wartości klucza indeksowego lub występuje przesunięcie wartości kluczy. W obu przypadkach wszystkie wiersze o tej samej wartości klucza indeksowego są hashowane do tego samego kubełka, co prowadzi do długiej długości łańcucha w tym kubełku.
Długie łańcuchy mogą znacząco wpływać na wydajność wszystkich operacji DML na poszczególnych wierszach, w tym SELECT i INSERT. Krótkie długości łańcuchów oraz wysoka liczba pustych wiader wskazują na zbyt wysoki bucket_count. To obniża wydajność skanowania indeksów.
Ostrzeżenie
Ten DMV skanuje cały stół. Jeśli więc w bazie są duże tabele, może to sys.dm_db_xtp_hash_index_stats potrwać długo.
Więcej informacji można znaleźć w artykule Hash Indexes for Memory-Optimized Tables.
| Nazwa kolumny | Typ | Description |
|---|---|---|
| object_id | int | Identyfikator obiektu tablicy nadrzędnej. |
| xtp_object_id | bigint | ID tabeli zoptymalizowanej pod pamięć. |
| index_id | int | ID indeksu. |
| total_bucket_count | bigint | Całkowita liczba hash bucketów w indeksie. |
| empty_bucket_count | bigint | Liczba pustych kubełek haszujących w indeksie. |
| avg_chain_length | bigint | Średnia długość łańcuchów wierszy na wszystkich kubełkach haszujących w indeksie. |
| max_chain_length | bigint | Maksymalna długość łańcuchów wierszy w hash bucketach. |
| xtp_object_id | bigint | In-Memory ID obiektu OLTP odpowiadający tabeli zoptymalizowanej pod pamięć. |
Permissions
Wymaga uprawnienia WYŚWIETL STAN BAZY DANYCH w bazie danych.
Uprawnienia dla programu SQL Server 2022 i nowszych
Wymaga uprawnienia WYŚWIETL STAN WYDAJNOŚCI BAZY DANYCH dla bazy danych.
Przykłady
A. Rozwiązywanie problemów z liczbą bucket indeksów haszujących
Następujące zapytanie może posłużyć do rozwiązania problemu z liczbą kubełek indeksu haszującego w istniejącej tabeli. Zapytanie zwraca statystyki dotyczące procentu pustych kubełów i długości łańcucha dla wszystkich indeksów skrótu w tabelach użytkownika.
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];
Szczegóły dotyczące interpretacji wyników tego zapytania można znaleźć w artykule Troubleshooting Hash Indexes for Memory-Optimized Tables.
B. Statystyki indeksu skrótu dla tabel wewnętrznych
Niektóre funkcje wykorzystują wewnętrzne tabele wykorzystujące indeksy skrótu, na przykład indeksy columnstore w tablicach zoptymalizowanych pod pamięć. Poniższe zapytanie zwraca statystyki indeksów skrótów w tabelach wewnętrznych powiązanych z tabelami użytkownika.
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];
Liczby kubełków indeksu w tabelach wewnętrznych nie mogą być zmieniane, dlatego wynik tego zapytania powinien być traktowany wyłącznie jako informacyjny. Nie trzeba podejmować żadnych działań.
To zapytanie nie powinno zwracać żadnych wierszy, chyba że używasz funkcji używającej indeksów skrótów w tabelach wewnętrznych. Poniższa tabela zoptymalizowana pod pamięć zawiera indeks columnstore. Po utworzeniu tej tabeli zobaczysz indeksy skrótów na tabelach wewnętrznych.
CREATE TABLE dbo.table_columnstore
(
c1 INT NOT NULL PRIMARY KEY NONCLUSTERED,
INDEX ix_columnstore CLUSTERED COLUMNSTORE
) WITH (MEMORY_OPTIMIZED=ON);
Treści powiązane
- Wprowadzenie do tabel zoptymalizowanych pod kątem pamięci
- Memory-Optimized Dynamiczne widoki zarządzania tabelą
- Architektura i przewodnik projektowy SQL Server i Azure SQL: Wytyczne dotyczące projektowania indeksów hash
- In-Memory Przegląd i scenariusze użycia OLTP
- Rozwiązywanie problemów z indeksami skrótów dla Memory-Optimized tabel
- Optymalizowanie wydajności przy użyciu technologii w pamięci w usłudze Azure SQL Database
- Optymalizowanie wydajności przy użyciu technologii w pamięci w usłudze Azure SQL Managed Instance