sys.dm_db_xtp_hash_index_stats (Transact-SQL)

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體

這些統計數據有助於瞭解和調整記憶體優化數據表中哈希索引的貯體計數。 它也可以用來偵測索引鍵有許多重複的情況。

大型平均鏈結長度表示許多數據列會哈希至相同的貯體。 這可能是因為:

  • 如果空值區的數目很低或平均且鏈結長度上限類似,則總值區計數可能太低。 這會導致許多不同的索引鍵哈希至相同的貯體。

  • 如果空值區的數目很高,或鏈結長度上限相對於平均鏈結長度而言很高,則有兩個可能的解釋。 有許多數據列具有重複的索引鍵值,或索引鍵值中有扭曲。 在任一情況下,具有相同索引鍵值哈希的所有數據列都會與相同的貯體,導致該貯體中的長鏈長度。

長鏈長度可能會大幅影響個別數據列上所有 DML 作業的效能,包括 SELECTINSERT。 短鏈長度以及高空值區計數表示bucket_count太高。 這會降低索引掃描的效能。

警告

此 DMV 會掃描整個數據表。 因此,如果您的資料庫中有大型數據表, sys.dm_db_xtp_hash_index_stats 可能需要很長的時間執行。

如需詳細資訊,請參閱 記憶體優化數據表的哈希索引。

資料行名稱 類型 描述
object_id int 父數據表的物件識別碼。
xtp_object_id bigint 記憶體優化數據表的標識碼。
index_id int 索引標識碼。
total_bucket_count bigint 索引中的哈希值區總數。
empty_bucket_count bigint 索引中的空哈希值區數目。
avg_chain_length bigint 數據列鏈結在索引中所有哈希值區的平均長度。
max_chain_length bigint 哈希貯體中數據列鏈結的最大長度。
xtp_object_id bigint 對應至記憶體優化數據表的記憶體內部 OLTP 物件標識碼。

權限

需要資料庫的 VIEW DATABASE STATE 許可權。

SQL Server 2022 和更新版本的權限

需要資料庫上的 VIEW DATABASE PERFORMANCE STATE 權限。

範例

A. 針對哈希索引貯體計數進行疑難解答

下列查詢可用來針對現有數據表的哈希索引貯體計數進行疑難解答。 此查詢會針對用戶數據表上所有哈希索引,傳回空值區百分比和鏈結長度的相關統計數據。

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

如需如何解譯此查詢結果的詳細資訊,請參閱 針對記憶體優化數據表的哈希索引進行疑難解答。

B. 內部數據表的哈希索引統計數據

某些功能會使用使用哈希索引的內部數據表,例如記憶體優化數據表上的數據行存放區索引。 下列查詢會針對連結至用戶數據表的內部數據表,傳回哈希索引的統計數據。

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

內部數據表上的索引值區計數無法變更,因此此查詢的輸出應該只被視為資訊。 您不需要執行任何動作。

除非您使用在內部數據表上使用哈希索引的功能,否則此查詢不會傳回任何數據列。 下列記憶體優化數據表包含數據行存放區索引。 建立此數據表之後,您會看到內部數據表上的哈希索引。

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