Udostępnij za pomocą


sys.dm_db_xtp_hash_index_stats (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure 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);