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);
Связанный контент
- Введение в таблицы, оптимизированные для памяти
- Динамические административные представления таблиц, оптимизированные для памяти
- Руководство по архитектуре и проектированию индексов SQL Server и Azure: рекомендации по проектированию хэш-индекса
- Обзор и сценарии использования OLTP в памяти
- Устранение неполадок хэш-индексов для оптимизированных для памяти таблиц
- Оптимизация производительности с помощью технологий в памяти в База данных SQL Azure
- Оптимизация производительности с помощью технологий в памяти в Управляемый экземпляр SQL Azure