sys.dm_db_index_operational_stats (Transact-SQL)
Se aplica a: SQL Server Azure SQL Database Azure SQL Managed Instance
Devuelve la actividad actual de E/S de nivel inferior, bloqueo, bloqueo temporal y método de acceso para cada partición de una tabla o índice de la base de datos.
Los índices con optimización para memoria no aparecen en esta DMV.
Nota:
sys.dm_db_index_operational_stats no devuelve información sobre los índices optimizados para memoria. Para obtener información sobre el uso de índices optimizados para memoria, consulte sys.dm_db_xtp_index_stats (Transact-SQL).
Convenciones de sintaxis de Transact-SQL
Sintaxis
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 }
)
Argumentos
database_id | NULL | 0 | PREDETERMINADO
Identificador de la base de datos. database_id es smallint. Las entradas válidas son el número de identificador de una base de datos, NULL, 0 y DEFAULT. El valor predeterminado es 0. NULL, 0 y DEFAULT son valores equivalentes en este contexto.
Especifique NULL para devolver información para todas las bases de datos de la instancia de SQL Server. Si especifica NULL para database_id, también debe especificar NULL para object_id, index_id y partition_number.
Se puede especificar la función integrada DB_ID.
object_id | NULL | 0 | PREDETERMINADO
Id. de objeto de la tabla o vista en la que está el índice. object_id es int.
Las entradas válidas son el número de identificador de una tabla o vista, NULL, 0 y DEFAULT. El valor predeterminado es 0. NULL, 0 y DEFAULT son valores equivalentes en este contexto.
Especifique NULL para devolver información en memoria caché de todas las tablas y vistas de la base de datos especificada. Si especifica NULL para object_id, también debe especificar NULL para index_id y partition_number.
index_id | 0 | NULL | -1 | PREDETERMINADO
Id. del índice. index_id es int. Las entradas válidas son el número de identificador de un índice, 0 si object_id es un montón, NULL, -1 o DEFAULT. El valor predeterminado es -1. NULL, -1 y DEFAULT son valores equivalentes en este contexto.
Especifique NULL para devolver información en memoria caché de todos los índices de una tabla o vista base. Si especifica NULL para index_id, también debe especificar NULL para partition_number.
partition_number | NULL | 0 | PREDETERMINADO
Número de partición en el objeto. partition_number es int. Las entradas válidas son la partion_number de un índice o montón, NULL, 0 o DEFAULT. El valor predeterminado es 0. NULL, 0 y DEFAULT son valores equivalentes en este contexto.
Especifique NULL para devolver información en memoria caché de todas las particiones del índice o montón.
partition_number se basa en 1. Un índice o montón no particionado tiene partition_number establecido en 1.
Tabla devuelta
Nombre de la columna | Tipo de datos | Descripción |
---|---|---|
database_id | smallint | Id. de la base de datos. En Azure SQL Database, los valores son únicos dentro de una base de datos única o un grupo elástico, pero no dentro de un servidor lógico. |
object_id | int | Identificador de la tabla o vista. |
id_de_índice | int | Identificador del índice o montón. 0 = Montón |
partition_number | int | Número de partición en base 1 en el índice o montón. |
hobt_id | bigint | Se aplica a: SQL Server 2016 (13.x) y versiones posteriores, Azure SQL Database. Identificador del montón de datos o del conjunto de filas de árbol B que realiza un seguimiento de los datos internos de un índice de almacén de columnas. NULL: no es un conjunto de filas de almacén de columnas interno. Para obtener más información, consulte sys.internal_partitions (Transact-SQL) |
leaf_insert_count | bigint | Recuento acumulado de inserciones en el nivel hoja. |
leaf_delete_count | bigint | Recuento acumulado de eliminaciones en el nivel hoja. leaf_delete_count solo se incrementa para los registros eliminados que no están marcados como fantasma primero. En primer lugar, en el caso de los registros eliminados que son fantasmas, leaf_ghost_count se incrementa en su lugar. |
leaf_update_count | bigint | Recuento acumulado de actualizaciones en el nivel hoja. |
leaf_ghost_count | bigint | Recuento acumulado de filas en el nivel hoja marcadas como eliminadas, pero que aún no se han quitado. Este recuento no incluye registros que se eliminan inmediatamente sin marcarse como fantasma. Estas filas se quitan mediante un subproceso de limpieza a intervalos establecidos. En este valor no se incluyen las filas retenidas a causa de una transacción de aislamiento de instantánea pendiente. |
nonleaf_insert_count | bigint | Recuento acumulado de inserciones por encima del nivel hoja. 0 = Montón o almacén de columnas |
nonleaf_delete_count | bigint | Recuento acumulado de eliminaciones por encima del nivel hoja. 0 = Montón o almacén de columnas |
nonleaf_update_count | bigint | Recuento acumulado de actualizaciones por encima del nivel hoja. 0 = Montón o almacén de columnas |
leaf_allocation_count | bigint | Recuento acumulado de asignaciones de página en el nivel hoja en el índice o el montón. En un índice, una asignación de página corresponde a una división de página. |
nonleaf_allocation_count | bigint | Recuento acumulado de asignaciones de página ocasionadas por divisiones de página por encima del nivel hoja. 0 = Montón o almacén de columnas |
leaf_page_merge_count | bigint | Recuento acumulado de combinaciones de página en el nivel hoja. Siempre es 0 para el índice de almacén de columnas. |
nonleaf_page_merge_count | bigint | Recuento acumulado de combinaciones de página por encima del nivel hoja. 0 = Montón o almacén de columnas |
range_scan_count | bigint | Recuento acumulado de recorridos de tabla e intervalo iniciados en el índice o el montón. |
singleton_lookup_count | bigint | Recuento acumulado de recuperaciones de filas únicas del índice o montón. |
forwarded_fetch_count | bigint | Recuento de filas que se capturan mediante un registro de reenvío. 0 = Índices |
lob_fetch_in_pages | bigint | Recuento acumulado de páginas de objetos grandes (LOB) recuperadas desde la unidad de asignación LOB_DATA. Estas páginas contienen datos almacenados en columnas de tipo text, ntext, image, varchar(max), nvarchar(max), varbinary(max)y xml. Para obtener más información, vea Tipos de datos (Transact-SQL). |
lob_fetch_in_bytes | bigint | Recuento acumulado de bytes de datos de LOB recuperados. |
lob_orphan_create_count | bigint | Recuento acumulado de valores de LOB huérfanos creados para operaciones masivas. 0 = Índice no clúster |
lob_orphan_insert_count | bigint | Recuento acumulado de valores de LOB huérfanos insertados durante operaciones masivas. 0 = Índice no clúster |
row_overflow_fetch_in_pages | bigint | Recuento acumulado de páginas de datos de desbordamiento de fila recuperadas desde la unidad de asignación ROW_OVERFLOW_DATA. Estas páginas contienen datos almacenados en columnas de tipo varchar(n),nvarchar(n), varbinary(n)y sql_variant que se han insertado fuera de fila. |
row_overflow_fetch_in_bytes | bigint | Recuento acumulado de bytes de datos de desbordamiento de fila recuperados. |
column_value_push_off_row_count | bigint | Recuento acumulado de valores de columna de datos de LOB y datos de desbordamiento de fila que se han insertado de manera no consecutiva para que una fila insertada o actualizada entre en una página. |
column_value_pull_in_row_count | bigint | Recuento acumulado de valores de columna de datos de LOB y datos de desbordamiento de fila que se han extraído de manera consecutiva. Esto ocurre cuando una operación de actualización libera espacio en un registro y proporciona una oportunidad para trasladar uno o más valores de manera no consecutiva de las unidades de asignación LOB_DATA o ROW_OVERFLOW_DATA a la unidad de asignación IN_ROW_DATA. |
row_lock_count | bigint | Número acumulado de bloqueos de fila solicitados. |
row_lock_wait_count | bigint | Número acumulado de veces que el Motor de base de datos espera en un bloqueo de fila. |
row_lock_wait_in_ms | bigint | Número total de milisegundos que Motor de base de datos esperaron en un bloqueo de fila. |
page_lock_count | bigint | Número acumulado de bloqueos de página solicitados. |
page_lock_wait_count | bigint | Número acumulado de veces que el Motor de base de datos espera en un bloqueo de página. |
page_lock_wait_in_ms | bigint | Número total de milisegundos que el Motor de base de datos espera en un bloqueo de página. |
index_lock_promotion_attempt_count | bigint | Número acumulado de veces que el Motor de base de datos intentó escalar bloqueos. |
index_lock_promotion_count | bigint | Número acumulado de veces que el Motor de base de datos bloqueos escalados. |
page_latch_wait_count | bigint | Número acumulado de veces que el Motor de base de datos ha esperado, debido a la contención de bloqueos temporales. |
page_latch_wait_in_ms | bigint | Número acumulado de milisegundos que el Motor de base de datos ha esperado, debido a la contención de bloqueos temporales. |
page_io_latch_wait_count | bigint | Número acumulado de veces que el Motor de base de datos espera en un bloqueo temporal de página de E/S. |
page_io_latch_wait_in_ms | bigint | Número acumulado de milisegundos que el Motor de base de datos espera en un bloqueo temporal de E/S de página. |
tree_page_latch_wait_count | bigint | Subconjunto de page_latch_wait_count que incluye solo las páginas de árbol B de nivel superior. Siempre es 0 para un índice de montón o de almacén de columnas. |
tree_page_latch_wait_in_ms | bigint | Subconjunto de page_latch_wait_in_ms que incluye solo las páginas de árbol B de nivel superior. Siempre es 0 para un índice de montón o de almacén de columnas. |
tree_page_io_latch_wait_count | bigint | Subconjunto de page_io_latch_wait_count que incluye solo las páginas de árbol B de nivel superior. Siempre es 0 para un índice de montón o de almacén de columnas. |
tree_page_io_latch_wait_in_ms | bigint | Subconjunto de page_io_latch_wait_in_ms que incluye solo las páginas de árbol B de nivel superior. Siempre es 0 para un índice de montón o de almacén de columnas. |
page_compression_attempt_count | bigint | Número de páginas que se evaluaron para la compresión en el nivel de página para particiones específicas de una tabla, un índice o una vista indizada. Incluye páginas que no se comprimieron porque no se consiguieron ahorros de espacio significativos. Siempre es 0 para el índice de almacén de columnas. |
page_compression_success_count | bigint | Número de páginas de datos que se comprimieron utilizando la compresión de páginas para particiones específicas de una tabla, un índice o una vista indizada. Siempre es 0 para el índice de almacén de columnas. |
Nota:
La documentación usa el término árbol B generalmente en referencia a índices. En los índices de almacén de filas, el Motor de base de datos implementa un árbol B+. Esto no se aplica a índices o índices de almacén de columnas en tablas optimizadas para memoria. Para obtener más información, consulte la guía de diseño y arquitectura de índices de SQL Server y Azure SQL.
Comentarios
Este objeto de administración dinámica no acepta parámetros correlacionados de CROSS APPLY
y OUTER APPLY
.
Puede usar sys.dm_db_index_operational_stats para realizar un seguimiento del período de tiempo que los usuarios deben esperar a leer o escribir en una tabla, índice o partición, e identificar las tablas o índices que encuentran una actividad de E/S significativa o puntos activos.
Use las columnas siguientes para identificar áreas de contención.
Para analizar un patrón de acceso común a la tabla o partición de índice, use estas columnas:
leaf_insert_count
leaf_delete_count
leaf_update_count
leaf_ghost_count
range_scan_count
singleton_lookup_count
Para identificar la contención de bloqueos y bloqueos temporales, utilice estas columnas:
page_latch_wait_count y page_latch_wait_in_ms
Estas columnas indican si existe una contención de bloqueos temporales en el índice o montón, y la importancia de la misma.
row_lock_count y page_lock_count
Estas columnas indican cuántas veces el Motor de base de datos intentó adquirir bloqueos de fila y página.
row_lock_wait_in_ms y page_lock_wait_in_ms
Estas columnas indican si existe una contención de bloqueos en el índice o montón y la importancia de la misma.
Para analizar estadísticas de E/S físicas en un índice o partición de montón
page_io_latch_wait_count y page_io_latch_wait_in_ms
Estas columnas indican si las operaciones de E/S físicas tuvieron problemas para traer las páginas de índice o montón a memoria y cuántas operaciones de E/S tuvieron problemas.
Comentarios de columna
Los valores de lob_orphan_create_count y lob_orphan_insert_count siempre deben ser iguales.
El valor de las columnas lob_fetch_in_pages y lob_fetch_in_bytes puede ser mayor que cero para los índices no agrupados que contienen una o varias columnas LOB como columnas incluidas. Para más información, consulte Create Indexes with Included Columns. Del mismo modo, el valor de las columnas row_overflow_fetch_in_pages y row_overflow_fetch_in_bytes puede ser mayor que 0 para los índices no agrupados si el índice contiene columnas que se pueden insertar fuera de fila.
Cómo se restablecen los contadores de la caché de metadatos
Los datos devueltos por sys.dm_db_index_operational_stats solo existen siempre que el objeto de caché de metadatos que represente el montón o índice esté disponible. Estos datos nunca son permanentes ni transaccionalmente coherentes. Esto significa que no se pueden utilizar estos contadores para determinar si se ha utilizado un índice o cuándo se usó por última vez. Para obtener información sobre esto, consulte sys.dm_db_index_usage_stats (Transact-SQL).
Los valores de cada columna se establecerán en cero siempre que los metadatos del montón o índice se incorporen a la memoria caché de metadatos y las estadísticas se acumulen hasta que el objeto de la memoria caché se quite de la memoria caché de metadatos. Por lo tanto, es probable que un montón o índice activo siempre tenga sus metadatos en la memoria caché y los recuentos acumulativos puedan reflejar la actividad desde que se inició por última vez la instancia de SQL Server. Los metadatos de un índice o montón menos activo entrarán y saldrán de la memoria caché según se utilicen. Como resultado, sus valores pueden estar disponibles o no. La eliminación de un índice hará que las estadísticas correspondientes se quiten de la memoria y que la función ya no informe de las mismas. Otras operaciones DDL en el índice pueden hacer que el valor de las estadísticas se restablezca en cero.
Uso de funciones del sistema para especificar valores de parámetro
Puede usar las funciones de Transact-SQL DB_ID y OBJECT_ID para especificar un valor para los parámetros database_id y object_id . Sin embargo, el envío de valores no válidos a estas funciones puede provocar resultados no deseados. Asegúrese de que se devuelva un identificador válido cuando utilice DB_ID u OBJECT_ID. Para obtener más información, vea la sección Comentarios de sys.dm_db_index_physical_stats (Transact-SQL).
Permisos
Necesita los siguientes permisos:
CONTROL
permiso en el objeto especificado dentro de la base de datosVIEW DATABASE STATE
oVIEW DATABASE PERFORMANCE STATE
(SQL Server 2022) permiso para devolver información sobre todos los objetos de la base de datos especificada, mediante el carácter comodín del objeto @object_id = NULLVIEW SERVER STATE
VIEW SERVER PERFORMANCE STATE
(SQL Server 2022) permiso para devolver información sobre todas las bases de datos mediante el carácter comodín de la base de datos @database_id = NULL
La concesión VIEW DATABASE STATE
permite devolver todos los objetos de la base de datos, independientemente de los permisos CONTROL denegados en objetos específicos.
Denegar VIEW DATABASE STATE
no permite que se devuelvan todos los objetos de la base de datos, independientemente de los permisos CONTROL concedidos en objetos específicos. Además, cuando se especifica el carácter comodín @database_id=NULL
de la base de datos, se omite la base de datos.
Para obtener más información, vea Dynamic Management Views and Functions (Transact-SQL) (Vistas y funciones de administración dinámica [Transact-SQL]).
Ejemplos
A Devolver información de una tabla especificada
En el ejemplo siguiente se devuelve información de todos los índices y particiones de la tabla de la Person.Address
base de datos AdventureWorks2022. La ejecución de esta consulta requiere, como mínimo, permiso CONTROL en la tabla Person.Address
.
Importante
Cuando use las funciones de Transact-SQL DB_ID y OBJECT_ID para devolver un valor de parámetro, asegúrese siempre de que se devuelva un identificador válido. Si el nombre de objeto o base de datos no se puede encontrar, por ejemplo, cuando no existe o se ha escrito incorrectamente, las dos funciones devolverán NULL. La función sys.dm_db_index_operational_stats interpreta NULL como un valor de carácter comodín que especifica todas las bases de datos o todos los objetos. Puesto que ésta puede ser una operación accidental, los ejemplos de esta sección demuestran una forma segura para determinar los Id. de bases de datos y objetos.
DECLARE @db_id int;
DECLARE @object_id int;
SET @db_id = DB_ID(N'AdventureWorks2022');
SET @object_id = OBJECT_ID(N'AdventureWorks2022.Person.Address');
IF @db_id IS NULL
BEGIN;
PRINT N'Invalid database';
END;
ELSE IF @object_id IS NULL
BEGIN;
PRINT N'Invalid object';
END;
ELSE
BEGIN;
SELECT * FROM sys.dm_db_index_operational_stats(@db_id, @object_id, NULL, NULL);
END;
GO
B. Devolver información de todas las tablas e índices
En el ejemplo siguiente se devuelve información de todas las tablas e índices dentro de la instancia de SQL Server. La ejecución de esta consulta requiere el permiso VIEW SERVER STATE.
SELECT * FROM sys.dm_db_index_operational_stats( NULL, NULL, NULL, NULL);
GO
Consulte también
Funciones y vistas de administración dinámica (Transact-SQL)
Funciones y vistas de administración dinámica relacionadas con índices (Transact-SQL)
Supervisión y optimización del rendimiento
sys.dm_db_index_physical_stats (Transact-SQL)
sys.dm_db_index_usage_stats (Transact-SQL)
sys.dm_os_latch_stats (Transact-SQL)
sys.dm_db_partition_stats (Transact-SQL)
sys.allocation_units (Transact-SQL)
sys.indexes (Transact-SQL)