sys.dm_db_xtp_hash_index_stats (Transact-SQL)

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

Эти статистические данные полезны для понимания и настройки количества сегментов для хэш-индексов в таблицах, оптимизированных для памяти. Их также можно использовать, чтобы определить наличие повторяющихся ключей индекса.

Большая средняя длина цепочки означает, что множество строк хэшируется в один контейнер. Это могло произойти по следующим причинам.

  • Если количество пустых контейнеров небольшое или средняя и максимальная длина цепочки близки по значению, вероятно, что общее число контейнеров слишком мало. Это приводит к тому, что разные ключи индекса хэшируются в один контейнер.

  • Если количество пустых контейнеров высоко или максимальная длина цепочки высока относительно средней длины цепочки, существует два вероятных объяснения. Существует множество строк с повторяющимися значениями ключа индекса или в значениях ключей возникает сбой. В любом случае все строки с одинаковым хэшом значения ключа индекса к одному контейнеру, что приводит к длинной длине цепочки в этом контейнере.

Длинная длина цепочки может значительно повлиять на производительность всех операций DML в отдельных строках, включая SELECT и INSERT. Короткие цепочки и большое число пустых контейнеров указывают на то, что значение bucket_count слишком велико. Это приводит к снижению производительности просмотра индекса.

Предупреждение

Этот динамический административный административный центр проверяет всю таблицу. Таким образом, если в базе данных есть большие таблицы, 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 для базы данных.

Примеры

А. Устранение неполадок с числом сегментов хэш-индекса

Следующий запрос можно использовать для устранения неполадок с числом сегментов хэш-индекса существующей таблицы. Запрос возвращает статистику о процентах пустых контейнеров и длине цепочки для всех хэш-индексов в пользовательских таблицах.

  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. Статистика хэш-индекса для внутренних таблиц

Некоторые функции используют внутренние таблицы, использующие хэш-индексы, например индексы columnstore в таблицах, оптимизированных для памяти. Следующий запрос возвращает статистику хэш-индексов во внутренних таблицах, связанных с пользовательскими таблицами.

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

Количество сегментов индекса во внутренних таблицах невозможно изменить, поэтому выходные данные этого запроса должны считаться только информативными. Предпринимать какие-либо действия не требуется.

Этот запрос не должен возвращать строки, если вы не используете функцию, использующую хэш-индексы во внутренних таблицах. Следующая таблица, оптимизированная для памяти, содержит индекс columnstore. После создания этой таблицы вы увидите хэш-индексы во внутренних таблицах.

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