Поделиться через


sys.dm_db_index_operational_stats (Transact-SQL)

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

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

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

Синтаксис

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 | ПО УМОЛЧАНИЮ

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

Укажите ЗНАЧЕНИЕ NULL для возврата сведений для всех баз данных в экземпляре SQL Server. Если для database_id задано значение NULL, необходимо также указать значение NULL для object_id, index_id и partition_number.

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

object_id | NULL | 0 | ПО УМОЛЧАНИЮ

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

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

Укажите ЗНАЧЕНИЕ NULL для возврата сведений для всех таблиц и представлений в указанной базе данных. Если для object_id задано значение NULL, необходимо также указать ЗНАЧЕНИЕ NULL для index_id и partition_number.

index_id | 0 | NULL | -1 | ПО УМОЛЧАНИЮ

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

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

partition_number | NULL | 0 | ПО УМОЛЧАНИЮ

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

Укажите ЗНАЧЕНИЕ NULL для возврата сведений для всех секций индекса или кучи.

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

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

Имя столбца Тип данных Description
database_id smallint Идентификатор базы данных.

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

NULL — это не внутренний набор строк columnstore.

Дополнительные сведения см. в разделе sys.internal_partitions (Transact-SQL).
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. Дополнительные сведения см. в разделе Типы данных (Transact-SQL).
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.

Примечание.

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

Замечания

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

Эта функция не принимает коррелированные параметры из 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_bytes могут быть больше нуля для некластеризованных индексовlob_fetch_in_pages, содержащих один или несколько столбцов бизнес-объектов, как включенные столбцы. Дополнительные сведения см. в разделе "Создание индексов с включенными столбцами". Аналогичным образом значения столбцов row_overflow_fetch_in_pages и row_overflow_fetch_in_bytes могут быть больше 0 для некластеризованных индексов, если индекс содержит большие строки.

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

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

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

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

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

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

Разрешения

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

  • 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 разрешений, предоставленных для определенных объектов.

Дополнительные сведения см. в статье "Динамические административные представления и функции" (Transact-SQL).

Примеры

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

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

Внимание

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

DECLARE @db_id int = DB_ID(N'AdventureWorks2025');
DECLARE @object_id 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;