sys.dm_db_index_operational_stats (Transact-SQL)

Применимо к:SQL ServerБаза данных Azure SQLУправляемый экземпляр Azure SQLБаза данных SQL в Microsoft Fabric

Возвращает доступ к данным нижнего уровня, блокировку и блокировку статистики для каждой секции таблицы или индекса в базе данных.

Соглашения о синтаксисе Transact-SQL

Syntax

sys.dm_db_index_operational_stats (
    { database_id | NULL | 0 | DEFAULT }
    , { object_id | NULL | 0 | DEFAULT }
    , { index_id | 0 | NULL | -1 | DEFAULT }
    , { partition_number | NULL | 0 | DEFAULT }
)

Аргументы

{ database_id | NULL | 0 | DEFAULT }

Идентификатор базы данных. database_id имеет небольшой размер. Допустимые входные данные — это идентификатор базы данных, NULL, 0, или DEFAULT. Значение по умолчанию — 0. NULL, 0и DEFAULT эквивалентны значениям в этом контексте.

Укажите NULL возвращаемые сведения для всех баз данных в экземпляре SQL Server. При указании NULL database_id необходимо также указать для NULL, index_id и partition_number.

Можно указать встроенную функцию DB_ID .

{ object_id | NULL | 0 | DEFAULT }

Идентификатор объекта таблицы или представления индекса включен. object_id имеет значение int.

Допустимые входные данные — это идентификатор таблицы и представление, NULL, 0, или DEFAULT. Значение по умолчанию — 0. NULL, 0и DEFAULT эквивалентны значениям в этом контексте.

Укажите NULL возвращаемую информацию для всех таблиц и представлений в указанной базе данных. Если вы указываете NULL для object_id, необходимо также указать для NULL и partition_number.

{ index_id | 0 | NULL | -1 | DEFAULT }

Идентификатор индекса. index_idэто интеллект. Допустимые входные данные — это идентификаторный номер индекса, 0 если object_id — куча, NULL, -1, или DEFAULT. Значение по умолчанию — -1. NULL, -1и DEFAULT эквивалентны значениям в этом контексте.

Укажите NULL , чтобы возвращать сведения для всех индексов базовой таблицы или представления. Если вы указываете NULL для index_id, необходимо также указать для partition_numberNULL.

{ partition_number | NULL | 0 | DEFAULT }

Номер секции в объекте. partition_numberint. Допустимые входные данные — это partition_number индекса или кучи, NULL, 0или DEFAULT. Значение по умолчанию — 0. NULL, 0и DEFAULT эквивалентны значениям в этом контексте.

Укажите NULL , чтобы возвращать информацию для всех разбиений индекса или кучи.

partition_number основан на 1. Непартиментный индекс или куча имеет значение 1 partition_number.

Таблица возвращена

Название столбца Тип данных Описание
database_id smallint Идентификатор базы данных.

В База данных SQL Azure значения уникальны в одной базе данных или эластичном пуле, но не в логическом сервере.
object_id int Идентификатор таблицы или представления. Для получения дополнительной информации смотрите sys.objects.
index_id int Идентификатор индекса или кучи. Для получения дополнительной информации смотрите sys.indexes.
partition_number int Номер секции внутри индекса или кучи (нумерация начинается с 1). Для получения дополнительной информации см. sys.partitions.
hobt_id bigint Идентификатор кучи данных или набора строк B-дерева, который отслеживает внутренние данные для индекса columnstore.

NULL - Это не внутренний набор строк Columnstore.

Дополнительные сведения см. в sys.internal_partitions.
leaf_insert_count bigint Совокупное количество вставок конечного уровня. Дополнительные сведения об уровнях индексов см. в руководстве по архитектуре и проектированию индекса.
leaf_delete_count bigint Совокупное количество удаленных конечных уровней. leaf_delete_count увеличивается только для удалённых записей, которые не помечены как призрак. Для удаленных записей, которые сначала фантомны, leaf_ghost_count увеличивается.
leaf_update_count bigint Совокупное количество обновлений конечного уровня.
leaf_ghost_count bigint Совокупное количество строк конечного уровня, помеченных как удаленные, но еще не удалены. Этот счёт не включает записи, которые сразу удаляются без маркировки как призрака. Поток очистки удаляет строки призраков с заданными интервалами. Это значение не включает призрачные ряды, которые сохраняются из-за невыполненной транзакции с моментом.
nonleaf_insert_count bigint Совокупное количество вставок выше конечного уровня. Применяется только к индексам B-дерева. 0 для кучи или индексов columnstore.
nonleaf_delete_count bigint Совокупное количество удалений выше конечного уровня. Применяется только к индексам B-дерева. 0 для кучи или индексов columnstore.
nonleaf_update_count bigint Совокупное количество обновлений выше конечного уровня. Применяется только к индексам B-дерева. 0 для кучи или индексов columnstore.
leaf_allocation_count bigint Совокупное количество выделений страницы конечного уровня в индексе или куче.

Для индекса размещение страницы соответствует разбиению страницы.
nonleaf_allocation_count bigint Совокупное количество размещений страниц, вызванных разбиениями страниц выше конечного уровня. Применяется только к индексам B-дерева. 0 для кучи или индексов columnstore.
leaf_page_merge_count bigint Совокупное количество слияний страниц на конечном уровне. Всегда 0 для индексов columnstore.
nonleaf_page_merge_count bigint Совокупное количество слияний страниц выше конечного уровня. Применяется только к индексам B-дерева. 0 для кучи или индексов columnstore.
range_scan_count bigint Совокупное количество просмотров диапазонов и таблиц, запущенных на индексе или куче.
singleton_lookup_count bigint Совокупное количество извлечений одиночных строк из индекса или кучи.
forwarded_fetch_count bigint Число строк, выбранных через перенаправляющую запись. Применяется только к кучам, 0 для индексов дерева B.
lob_fetch_in_pages bigint Совокупное количество страниц больших объектов (LOB), полученных из LOB_DATA единицы выделения. Эти страницы содержат данные, хранящиеся в столбцах типа text, ntext, image, varchar(max), nvarchar(max), varbinary(max), xml и json. Дополнительные сведения см. в разделе Типы данных.
lob_fetch_in_bytes bigint Совокупное количество извлеченных байтов данных LOB.
lob_orphan_create_count bigint Совокупное количество потерянных значений LOB, созданных для массовых операций. Применяется только к кучам и кластеризованным индексам B-дерева, 0 для некластеризованных и столбцов columnstore.
lob_orphan_insert_count bigint Совокупное количество потерянных значений LOB, вставленных во время массовых операций. Применяется только к кучам и кластеризованным индексам B-дерева, 0 для некластеризованных и столбцов columnstore.
row_overflow_fetch_in_pages bigint Совокупное количество страниц данных переполнения строк, полученных из ROW_OVERFLOW_DATA единицы выделения.

Эти страницы содержат данные, хранящиеся в столбцах типа varchar(n), nvarchar(n)varbinary(n)и sql_variant для больших строк.
row_overflow_fetch_in_bytes bigint Совокупное количество извлеченных байтов, превышающих размер страницы данные строки.
column_value_push_off_row_count bigint Совокупное количество значений столбца для данных LOB и превышающих размер страницы данные строки, которые вытесняются из строки, чтобы вместить на странице вставленную или обновленную строку.
column_value_pull_in_row_count bigint Совокупное количество значений столбцов для данных LOB и превышающих размер страницы данные строки, которые помещаются в строку. Это происходит, когда операция обновления освобождает место в записи и предоставляет возможность извлекать одно или несколько внестроковых значений из LOB_DATAROW_OVERFLOW_DATA единиц распределения в единицу IN_ROW_DATA выделения.
row_lock_count bigint Совокупное количество запрошенных блокировок строк.
row_lock_wait_count bigint Совокупное количество раз, когда ядро СУБД ждали блокировки строки.
row_lock_wait_in_ms bigint Общее количество миллисекундах ядро СУБД ждали блокировки строки.
page_lock_count bigint Совокупное количество запрошенных блокировок страниц.
page_lock_wait_count bigint Совокупное количество раз, когда ядро СУБД ждал блокировку страницы.
page_lock_wait_in_ms bigint Общее количество миллисекунда ядро СУБД, ожидалось на блокировке страницы.
index_lock_promotion_attempt_count bigint Совокупное число попыток эскалации блокировки ядро СУБД.
index_lock_promotion_count bigint Совокупное количество раз, когда ядро СУБД эскалации блокировок.
page_latch_wait_count bigint Совокупное количество раз, когда ядро СУБД ждало получения блокировки.
page_latch_wait_in_ms bigint Совокупное число миллисекундах ядра СУБД ждало получения блокировки.
page_io_latch_wait_count bigint Совокупное число попыток ожидания ядра СУБД на вкладке ввода-вывода страницы.
page_io_latch_wait_in_ms bigint Совокупное количество миллисекундах ядро СУБД ожидалось на блоке ввода-вывода страницы.
tree_page_latch_wait_count bigint Подмножество page_latch_wait_count из этого включает только страницы верхнего уровня B-дерева. Всегда 0 для кучи или индекса columnstore.
tree_page_latch_wait_in_ms bigint Подмножество page_latch_wait_in_ms из этого включает только страницы верхнего уровня B-дерева. Всегда 0 для кучи или индекса columnstore.
tree_page_io_latch_wait_count bigint Подмножество page_io_latch_wait_count из этого включает только страницы верхнего уровня B-дерева. Всегда 0 для кучи или индекса columnstore.
tree_page_io_latch_wait_in_ms bigint Подмножество page_io_latch_wait_in_ms из этого включает только страницы верхнего уровня B-дерева. Всегда 0 для кучи или индекса columnstore.
page_compression_attempt_count bigint Количество страниц, которые были оценены для PAGE сжатия уровней для конкретного раздела таблицы, индекса или индексированного вида. Включает страницы, которые не были сжаты, потому что не удалось добиться значительной экономии. Всегда 0 для индексов columnstore.
page_compression_success_count bigint Количество страниц данных, сжатых с помощью PAGE сжатия для определённых разделов таблицы, индекса или индексированного вида. Всегда 0 для индексов columnstore.
version_generated_inrow bigint Совокупное количество версий в строке с полезными данными, созданными в куче или в дереве B для обновления, слияния или операции вставки над призраком. Версия в строке сохраняет старый образ строки (или дифф) непосредственно в строке, избегая поездки в хранилище версий. Это супермножество, включающее версии, которые учитываются insert_over_ghost_version_inrow. Дополнительные сведения о версиях в строке и вне строк см. в разделе "Пространство", используемое хранилищем постоянных версий (PVS).
version_generated_offrow bigint Совокупное количество версий, отправленных в хранилище вне строк для кучи, дерева B или бизнес-аналитики, обновления, слияния или операции вставки над призраком. Версия вне строки генерируется, когда старое изображение строки нельзя удерживать в строке. Это супермножество, включающее версии, подсчитываемые ghost_version_offrow и insert_over_ghost_version_offrow.
ghost_version_inrow bigint Совокупное количество раз удаления или обновления (выполняется как удаление, за которым следует вставка) помечает существующую строку как призрак с информацией о версиях в строке. Версия в строке сохраняет только метку времени транзакции и полезные данные нулевой длины, поэтому отмена удаления требует только unghosting этой строки.
ghost_version_offrow bigint Совокупное количество операций удаления или обновления (выполненное как удаление, за которым следует вставка), принудило существующие данные столбца строки или бизнес-столбца к хранилищу вне строк, оставив заглушку в строке для получения сведений о версиях. Этот счетчик увеличивается вместе с version_generated_offrow во время операций призрака.
insert_over_ghost_version_inrow bigint Совокупное количество версий в строке с полезными данными, созданными для операции вставки из дерева B-over-ghost. При вставке над призраком возникает, когда новая строка вставляется в слот ранее фантомной записи либо из явного удаления, за которым следует вставка, либо из обновления или слияния, реализованной как удаление, за которым следует вставка. Этот счетчик представляет собой подмножество version_generated_inrow.
insert_over_ghost_version_offrow bigint Совокупное количество раз, когда существующая строка призрака была отправлена в хранилище вне строк во время операции вставки из дерева B-over-ghost, оставив заглушку в только что вставленной строке для сведений о версиях. Этот счетчик представляет собой подмножество version_generated_offrow.
compaction_attempt_count bigint Совокупное количество попыток автоуплотнения индекса. Для получения дополнительной информации см. раздел Автоматическое уплотнение индекса (предварительный просмотр).
compaction_complete_count bigint Совокупное количество завершённых индексных автоуплотнений.
compaction_skip_count bigint Совокупное количество пропущенных индексных автоуплотнений. Для получения дополнительной информации о причинах пропуска см. раздел «Использовать расширенное событие для мониторинга статистики уплотнения».
compaction_ineligible_count bigint Совокупное количество попыток уплотнения было пропущено, потому что страница не подпадала для автоуплотнения.
compaction_failure_count bigint Совокупное количество неудачных попыток уплотнения.
compaction_row_move_count bigint Накопленное количество строк перемещалось с одной страницы на другую в рамках автоуплотнения.
compaction_page_deallocation_count bigint Совокупное количество страниц, которые были сняты после переноса всех строк на другую страницу.

Note

В документации термин B-tree обычно используется в ссылке на индексы. В индексах rowstore ядро СУБД реализует дерево B+. Это не относится к индексам columnstore или индексам в таблицах, оптимизированных для памяти. Дополнительные сведения см. в руководстве по архитектуре и проектированию индексов SQL Sql Server и Azure.

Замечания

Эта функция не возвращает сведения об индексах в таблицах, оптимизированных для памяти. Для информации об индексах в таблицах, оптимизированных по памяти, см. sys.dm_db_xtp_index_stats.

Эта функция не принимает коррелированные параметры из CROSS APPLY и OUTER APPLY.

Вы можете отслеживать sys.dm_db_index_operational_stats статистику операций чтения и записи данных, а также блокировку, блокировку страниц и статистику блокировок ввода-вывода страниц для таблицы, индекса или секции. Вы можете определить таблицы, индексы и секции, которые сталкиваются со значительным действием или спором.

Статистика предоставляется на уровне секции и является аддитивной. Это означает, что можно получить статистику уровня индекса или таблицы, написав агрегатный запрос в T-SQL. Дополнительные сведения см. в разделе "Сканирование индекса" и поиск для всех примеров таблиц .

Чтобы проанализировать статистику операций чтения и записи для таблицы, индекса или секции, используйте следующие столбцы:

  • leaf_insert_count
  • leaf_delete_count
  • leaf_update_count
  • leaf_ghost_count
  • range_scan_count
  • singleton_lookup_count

Чтобы определить конфликты с блокировкой, используйте следующие столбцы:

  • page_latch_wait_count
  • page_latch_wait_in_ms

Чтобы определить конфликт блокировки, используйте следующие столбцы:

  • row_lock_count
  • page_lock_count
  • row_lock_wait_in_ms
  • page_lock_wait_in_ms

Чтобы проанализировать статистику физических операций ввода-вывода, используйте следующие столбцы:

  • page_io_latch_wait_count
  • page_io_latch_wait_in_ms

Примечания к столбцам

Значения в столбцах и lob_fetch_in_pages могут быть больше нуля для некластеризованных индексовlob_fetch_in_bytes, содержащих один или несколько столбцов бизнес-объектов, как включенные столбцы. Дополнительные сведения см. в разделе "Создание индексов с включенными столбцами". Аналогичным образом значения столбцов row_overflow_fetch_in_pages и row_overflow_fetch_in_bytes могут быть больше 0 для некластеризованных индексов, если индекс содержит большие строки.

Как счетчики в кэше метаданных сбрасываются

Данные, возвращаемые данными sys.dm_db_index_operational_stats , существуют только до тех пор, пока доступен объект кэша метаданных, представляющий кучу или дерево B-дерева. Эти данные не являются устойчивыми. Это означает, что вы не можете использовать эти счётчики для однозначного определения, использовался ли индекс или когда он был использован в последний раз. Вместо этого используйте sys.dm_db_index_usage_stats.

Значения для каждого числового столбца равны нулю, если метаданные для кучи или дерева B-данных будут доставлены в кэш метаданных. Статистика накапливается, пока объект кэша не будет удален из кэша метаданных. Активная куча или дерево B-дерева обычно содержит свои метаданные в кэше, а совокупные счетчики отражают действие после последнего запуска экземпляра ядра СУБД. Метаданные для менее активной кучи или B-дерева могут перемещаться в кэш и из него при использовании, особенно если экземпляр ядро СУБД находится под давлением памяти. В результате статистика операций индексов иногда не отражается sys.dm_db_index_operational_stats. Это нетипично.

Статистика удаляется из кэша и больше не сообщается этой функцией, если таблица или индекс удалены, или если секция усечена. Другие операции DDL с индексом могут привести к сбросу значения статистики до нуля.

Использование системных функций для указания значений параметров

Функции Transact-SQL можно использовать DB_ID и OBJECT_ID , чтобы указать значение для параметров database_id и object_id . Однако передача некорректных значений этим функциям может привести к нежелательным последствиям. Всегда убедитесь, что допустимый идентификатор возвращается при использовании DB_ID или OBJECT_ID. Дополнительные сведения см. в разделе "Возвращаемые сведения" для указанной таблицы.

Permissions

Необходимы следующие разрешения:

  • CONTROL разрешение на указанный объект в базе данных

  • VIEW DATABASE STATE или VIEW DATABASE PERFORMANCE STATE разрешение возвращать информацию обо всех объектах в указанной базе данных, если значение для @object_id не указано.

  • VIEW SERVER STATE или VIEW SERVER PERFORMANCE STATE разрешение возвращать информацию обо всех базах данных, если значение для @database_id не указано.

VIEW DATABASE STATE Предоставление или VIEW SERVER PERFORMANCE STATE разрешение возврата всех объектов в базе данных независимо от каких-либо CONTROL разрешений, запрещенных для определенных объектов.

Запретить VIEW DATABASE STATE или VIEW SERVER PERFORMANCE STATE запретить возврат всех объектов в базе данных независимо от любых CONTROL разрешений, предоставленных для определенных объектов.

Для получения дополнительной информации см. Режимы и функции управления динамикой системы.

Examples

Возврат сведений для указанной таблицы

Следующий пример возвращает информацию по всем индексам и разделам Person.Address таблицы в базе данных AdventureWorks2025.

Это важно

Когда вы используете функции DB_ID Transact-SQL и OBJECT_ID возвращаете значение параметра, всегда убедитесь, что возвращается действительный идентификатор. Если не удается найти имя базы данных или объекта, например, если они не существуют или неправильно написаны, обе функции возвращаются NULL. Функция sys.dm_db_index_operational_stats интерпретирует как подстановочное NULL значение, указывающее все базы данных или все объекты. Так как эта операция может быть непреднамеренной, примеры в этом разделе демонстрируют безопасный способ определения идентификаторов базы данных и объекта.

DECLARE @db_id AS INT = DB_ID(N'AdventureWorks2025');
DECLARE @object_id AS INT = OBJECT_ID(N'AdventureWorks2025.Person.Address');

SELECT *
FROM sys.dm_db_index_operational_stats(@db_id, @object_id, NULL, NULL)
WHERE @db_id IS NOT NULL
      AND @object_id IS NOT NULL;

Возврат сведений для всех таблиц и индексов

В следующем примере возвращаются сведения обо всех таблицах и индексах экземпляра ядра СУБД.

SELECT *
FROM sys.dm_db_index_operational_stats(NULL, NULL, NULL, NULL);

Сканирование индекса и поиск для всех таблиц

В следующем примере данные уровня секции объединяются для возврата статистики поиска и сканирования индекса для всех таблиц в текущей базе данных.

SELECT OBJECT_SCHEMA_NAME(object_id) AS schema_name,
       OBJECT_NAME(object_id) AS object_name,
       COUNT(DISTINCT(index_id)) AS index_count,
       COUNT(DISTINCT(partition_number)) AS partition_count,
       SUM(range_scan_count) AS index_scan_count,
       SUM(singleton_lookup_count) AS index_seek_count
FROM sys.dm_db_index_operational_stats(DB_ID(), DEFAULT, DEFAULT, DEFAULT)
GROUP BY OBJECT_SCHEMA_NAME(object_id),
         OBJECT_NAME(object_id)
ORDER BY schema_name, object_name;