sys.dm_db_index_operational_stats (Transact-SQL)
Devuelve las entradas y salidas de bajo nivel actuales, el bloqueo, el bloqueo temporal y la actividad de método de acceso de cada partición de una tabla o índice de la base de datos.
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 | DEFAULT
Identificador de la base de datos. database_id es de tipo 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 de todas las bases de datos en la instancia de SQL Server. Si especifica NULL en database_id, también debe especificar NULL en object_id, index_id y partition_number.
Se puede especificar la función integrada DB_ID. Cuando se usa DB_ID sin especificar ningún nombre de base de datos, el nivel de compatibilidad de la base de datos actual debe ser 90.
object_id | NULL | 0 | DEFAULT
Identificador de objeto de la tabla o vista donde está activado el índice. object_id es de tipo 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 almacenada en caché de todas las tablas y vistas de la base de datos especificada. Si especifica NULL en object_id, también debe especificar NULL en index_id y partition_number.
index_id | 0 | NULL | -1 | DEFAULT
Identificador del índice. index_id es de tipo int. Las entradas válidas son el número de identificador de un índice, 0 si object_id es un montón, NULL, -1 y DEFAULT. El valor predeterminado es -1. NULL, -1 y DEFAULT son valores equivalentes en este contexto.Especifique NULL para devolver información almacenada en caché de todos los índices de una vista o tabla base. Si especifica NULL para index_id, también debe especificar NULL para partition_number.
partition_number | NULL | 0 | DEFAULT
Número de partición en el objeto. partition_number es de tipo int. Las entradas válidas son el número de partición (partion_number) de un índice o montón, 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 almacenada en caché de todas las particiones del índice o montón.
partition_number es de base 1. Un índice o montón sin particiones tiene partition_number establecido en 1.
Tabla devuelta
Nombre de columna |
Tipo de datos |
Descripción |
---|---|---|
database_id |
smallint |
Identificador de la base de datos. |
object_id |
int |
Identificador de la tabla o vista. |
index_id |
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. |
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_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. 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. Para obtener más información acerca de las transacciones de aislamiento de instantánea, vea Niveles de aislamiento basado en el control de versiones de filas del motor de base de datos. |
nonleaf_insert_count |
bigint |
Recuento acumulado de inserciones por encima del nivel hoja. 0 = Montón |
nonleaf_delete_count |
bigint |
Recuento acumulado de eliminaciones por encima del nivel hoja. 0 = Montón |
nonleaf_update_count |
bigint |
Recuento acumulado de actualizaciones por encima del nivel hoja. 0 = Montón |
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 |
leaf_page_merge_count |
bigint |
Recuento acumulado de combinaciones de página en el nivel hoja. |
nonleaf_page_merge_count |
bigint |
Recuento acumulado de combinaciones de página por encima del nivel hoja. 0 = Montón |
range_scan_count |
bigint |
Recuento acumulado de recorridos de tabla e intervalo iniciados en el índice o 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 obtienen 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 que se almacenan 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). Para obtener más información acerca de las unidades de asignación, vea Organización de tablas e índices. |
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 que se almacenan en columnas de tipo varchar(n), nvarchar(n), varbinary(n) y sql_variant, y que se han insertado de manera no consecutiva. Para obtener más información, vea Datos de desbordamiento de fila superiores a 8 KB. Para obtener más información acerca de las unidades de asignación, vea Organización de tablas e índices. |
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. Para obtener más información acerca de las unidades de asignación, vea Organización de tablas e índices. |
row_lock_count |
bigint |
Número acumulado de bloqueos de fila solicitados. |
row_lock_wait_count |
bigint |
Número acumulado de veces que el Database Engine (Motor de base de datos) ha esperado en un bloqueo de fila. |
row_lock_wait_in_ms |
bigint |
Número total de milisegundos que el Database Engine (Motor de base de datos) ha esperado 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 Database Engine (Motor de base de datos) ha esperado en un bloqueo de página. |
page_lock_wait_in_ms |
bigint |
Número total de milisegundos que el Database Engine (Motor de base de datos) ha esperado en un bloqueo de página. |
index_lock_promotion_attempt_count |
bigint |
Número acumulado de veces que el Database Engine (Motor de base de datos) ha intentado concentrar bloqueos. |
index_lock_promotion_count |
bigint |
Número acumulado de veces que el Database Engine (Motor de base de datos) ha concentrado bloqueos. |
page_latch_wait_count |
bigint |
Número acumulado de veces que el Database Engine (Motor de base de datos) ha esperado a causa de la contención de bloqueos temporales. |
page_latch_wait_in_ms |
bigint |
Número acumulado de milisegundos que el Database Engine (Motor de base de datos) ha esperado a causa de la contención de bloqueos temporales. |
page_io_latch_wait_count |
bigint |
Número acumulado de veces que el Database Engine (Motor de base de datos) ha esperado en un bloqueo temporal de E/S de páginas. |
page_io_latch_wait_in_ms |
bigint |
Número acumulado de milisegundos que el Database Engine (Motor de base de datos) ha esperado en un bloqueo temporal de E/S de páginas. |
tree_page_latch_wait_count |
bigint |
Subconjunto de page_latch_wait_count que incluye solamente las páginas de nivel superior del árbol b. Siempre es 0 para un montón. |
tree_page_latch_wait_in_ms |
bigint |
Subconjunto de page_latch_wait_in_ms que incluye solamente las páginas de nivel superior del árbol b. Siempre es 0 para un montón. |
tree_page_io_latch_wait_count |
bigint |
Subconjunto de page_io_latch_wait_count que incluye solamente las páginas de nivel superior del árbol b. Siempre es 0 para un montón. |
tree_page_io_latch_wait_in_ms |
bigint |
Subconjunto de page_io_latch_wait_in_ms que incluye solamente las páginas de nivel superior del árbol b. Siempre es 0 para un montón. |
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. |
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. |
Notas
Este objeto de administración dinámica no acepta parámetros correlacionado de CROSS APPLY y OUTER APPLY.
Puede utilizar sys.dm_db_index_operational_stats para realizar el seguimiento del tiempo que los usuarios tienen que esperar para leer o escribir en una tabla, índice o partición, e identificar las tablas o índices que tienen puntos o actividades de E/S importantes.
Use las columnas siguientes para identificar áreas de contención.
Para analizar un patrón de acceso común a la partición del índice o la tabla, utilice 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 Database Engine (Motor de base de datos) ha intentado adquirir bloqueos de página y fila.
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 operaciones de E/S físicas en una partición de índice o 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 en lob_orphan_create_count y lob_orphan_insert_count siempre deben ser iguales.
El valor en las columnas lob_fetch_in_pages y lob_fetch_in_bytes puede ser mayor que cero para índices no clúster que contengan una o varias columnas de LOB como columnas incluidas. Para obtener más información, vea Índice con columnas incluidas. De forma similar, el valor en las columnas row_overflow_fetch_in_pages y row_overflow_fetch_in_bytes puede ser mayor que cero para índices no clúster si el índice contiene columnas que se pueden insertar de manera no consecutiva. Para obtener más información, vea Datos de desbordamiento de fila superiores a 8 KB.
Cómo se restablecen los contadores de la caché de metadatos
Los datos devueltos por sys.dm_db_index_operational_stats existen solamente mientras está disponible el objeto de memoria caché de metadatos que representa el montón o el índice. 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 más información, vea 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 tanto, es probable que un índice o montón activo tenga siempre sus metadatos en la memoria caché, y los recuentos acumulados puedan reflejar la actividad desde la última vez que se inició 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.
Usar funciones del sistema para especificar valores de parámetros
Puede utilizar las funciones de Transact-SQLDB_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 siempre se devuelva un identificador válido al utilizar DB_ID u OBJECT_ID. Para obtener más información, vea la sección Notas en sys.dm_db_index_physical_stats (Transact-SQL).
Permisos
Necesita los siguientes permisos:
Permiso CONTROL en el objeto especificado en la base de datos
Permiso VIEW DATABASE STATE para devolver información de todos los objetos en la base de datos especificada, utilizando el carácter comodín de objeto @object\_id = NULL
Permiso VIEW SERVER STATE para devolver información de todas las bases de datos, utilizando el carácter comodín de base de datos @database\_id = NULL
El permiso VIEW DATABASE STATE permite devolver todos los objetos de la base de datos, independientemente de que se hayan denegado permisos CONTROL a objetos específicos.
Si se deniega el permiso VIEW DATABASE STATE, no se puede devolver ningún objeto de la base de datos, independientemente de que se hayan concedido permisos CONTROL a objetos específicos. Además, si se especifica el carácter comodín de base de datos @database\_id=NULL, la base de datos se omite.
Para obtener más información, vea Funciones y vistas de administración dinámica (Transact-SQL).
Ejemplos
A. Devolver información de una tabla especificada
En el siguiente ejemplo se devuelve información de todos los índices y particiones de la tabla Person.Address en la base de datos AdventureWorks. La ejecución de esta consulta requiere, como mínimo, permiso CONTROL en la tabla Person.Address.
Importante |
---|
Cuando utilice las funciones DB_ID y OBJECT_ID de Transact-SQL para devolver un valor de parámetro, asegúrese de que siempre 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. Dado que esta puede ser una operación accidental, los ejemplos de esta sección muestran una forma segura de determinar los identificadores de bases de datos y objetos. |
DECLARE @db_id int;
DECLARE @object_id int;
SET @db_id = DB_ID(N'AdventureWorks');
SET @object_id = OBJECT_ID(N'AdventureWorks.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 siguiente ejemplo se devuelve información de todas las tablas e índices en 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
Vea también