Megosztás a következőn keresztül:


sys.dm_db_xtp_hash_index_stats (Transact-SQL)

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Ezek a statisztikák hasznosak a hash indexek vödörszámának megértéséhez és hangolásához a memóriaoptimalizált táblázatokban. Használható olyan esetek felismerésére is, amikor az indexkulcs sok másolatot tartalmaz.

Egy nagy átlagos lánchossz azt jelzi, hogy sok sor ugyanahhoz a vödörbe van hashelve. Ez megtörténhet, mert a következők:

  • Ha az üres vödrök száma alacsony, vagy az átlagos és maximális lánchossz hasonló, akkor valószínű, hogy a teljes vödr száma túl alacsony. Ez sok különböző indexkulcsot eredményez, hogy ugyanabba a vödörbe hashel.

  • Ha az üres vödrök száma magas, vagy a maximális lánchossz magas az átlagos lánchosszhoz képest, két valószínű magyarázat létezik. Sok sor van, ahol duplikált indexkulcs értékek vannak, vagy a kulcsértékek torzítása van. Mindkét esetben minden sor, amelynek azonos indexkulcsértéke van, ugyanabba a vödörbe hash, ami hosszú lánchosszhoz vezet abban a vödörben.

A hosszú lánchosszok jelentősen befolyásolhatják az egyes sorokon végzett DML műveletek teljesítményét, beleértve SELECT és INSERT. A rövid lánchosszok és a magas üres vödrös szám arra utalnak, hogy túl magas bucket_count. Ez csökkenti az indexvizsgálatok teljesítményét.

Figyelmeztetés

Ez a DMV az egész táblát átvizsgálja. Tehát ha nagy táblák vannak az adatbázisodban, sys.dm_db_xtp_hash_index_stats az hosszú időbe telhet.

További információért lásd: Hash indexek Memory-Optimized táblázatokhoz.

Oszlop név Típus Description
object_id int Az anyatáblák objektumazonosítója.
xtp_object_id bigint A memóriaoptimalizált tábla azonosítója.
index_id int Az index azonosító.
total_bucket_count bigint Az indexben lévő hash bucketek teljes száma.
empty_bucket_count bigint Az indexben lévő üres hash vödrök száma.
avg_chain_length bigint A sorláncok átlagos hossza az index összes hash vödörén át.
max_chain_length bigint A hash vödörökben lévő sorláncok maximális hossza.
xtp_object_id bigint A In-Memory OLTP objektumazonosító, amely megfelel a memóriaoptimalizált táblának.

Permissions

A VIEW DATABASE STATE engedélyre van szükség az adatbázisban.

Engedélyek az SQL Server 2022-hez és újabb verziókhoz

Az adatbázishoz a VIEW DATABASE PERFORMANCE STATE engedélyre van szükség.

Példák

A. Keresés hash index bucket count

A következő lekérdezés segítségével elháríthatja egy meglévő tábla hash index bucket számát. A lekérdezés statisztikákat ad vissza az üres vödrök százalékáról és lánchosszáról az összes hash indexhez a felhasználói táblákon.

  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];  

A lekérdezés eredményeinek értelmezéséről a részletekért lásd: Troubleshooting Hash Indexes for Memory-Optimized Tables.

B. Hash index statisztikák belső táblákhoz

Bizonyos funkciók belső táblázatokat használnak, amelyek hash indexeket használnak, például columnstore indexeket memóriaoptimalizált táblákon. A következő lekérdezés a felhasználói táblákhoz kapcsolt belső táblák hash indexeinek statisztikáit adja.

  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]; 

Az index belső táblák vödörszáma nem változtatható, ezért ennek a lekérdezésnek a kimenetét csak információs jellegűnek kell tekinteni. Nincs szükség műveletre.

Ez a lekérdezés nem várható, hogy sorokat adjon, hacsak nem használsz olyan funkciót, amely hash indexeket használ belső táblákon. Az alábbi memóriaoptimalizált táblázat egy oszloptároló indexet tartalmaz. A táblázat létrehozása után hash indexeket fogsz látni a belső táblákon.

  CREATE TABLE dbo.table_columnstore
  (
      c1 INT NOT NULL PRIMARY KEY NONCLUSTERED,
      INDEX ix_columnstore CLUSTERED COLUMNSTORE
  ) WITH (MEMORY_OPTIMIZED=ON);