Uso de recursos del control de versiones de filas

El marco del control de versiones de filas admite las siguientes características disponibles en SQL Server:

  • Desencadenadores

  • Conjuntos de resultados activos múltiples (MARS)

  • Índices en línea

El marco del control de versiones de filas también admite los siguientes niveles de aislamiento de transacción basado en el control de versiones de filas que, de forma predeterminada, no se habilitan:

  • Cuando la opción de base de datos READ_COMMITTED_SNAPSHOT es ON, las transacciones READ_COMMITTED proporcionan coherencia de lectura de nivel de instrucciones con control de versiones de filas.

  • Cuando la opción de base de datos ALLOW_SNAPSHOT_ISOLATION es ON, las transacciones SNAPSHOT proporcionan coherencia de lectura de nivel de instrucciones con control de versiones de filas.

Los niveles de aislamiento basado en el control de versiones de filas reducen el número de bloqueos adquiridos por transacción mediante la eliminación del uso de bloqueos compartidos en operaciones de lectura. Esto aumenta el rendimiento del sistema al reducir los recursos utilizados para administrar bloqueos. El rendimiento también aumenta al reducir el número de veces que una transacción se bloquea mediante bloqueos adquiridos por otras transacciones.

Los niveles de aislamiento basado en el control de versiones de filas aumentan los recursos necesarios para la modificación de datos. Al habilitar estas opciones se crean versiones de filas de todas las modificaciones de datos para la base de datos. Se guarda una copia de los datos sin modificar en tempdb aunque no haya ninguna transacción activa que utilice el aislamiento basado en el control de versiones de filas. Los datos modificados incluyen un puntero a los datos con versiones almacenados en tempdb. En el caso de objetos grandes, sólo se copia en tempdb la parte del objeto modificada.

Espacio utilizado en tempdb

En cada instancia de Motor de base de datos, tempdb debe disponer de espacio suficiente para contener las versiones de filas generadas por todas las bases de datos de la instancia. El administrador de la base de datos debe asegurarse de que tempdb cuenta con espacio más que suficiente para dar cabida al almacén de versiones. Existen dos almacenes de versiones en tempdb:

  • El almacén de versiones de generación de índices en línea se utiliza para generar índices en línea en todas las bases de datos.

  • El almacén de versiones común se utiliza en las demás operaciones de modificación de datos de todas las bases de datos.

Las versiones de filas deben estar almacenadas mientras una transacción activa necesite tener acceso a ella. Cada minuto, un subproceso en segundo plano elimina las versiones de filas que ya no se necesitan y libera el espacio de versiones en tempdb. Una transacción de larga duración impide que se libere el espacio del almacén de versiones si se cumple alguna de las siguientes condiciones:

  • Se utiliza el aislamiento basado en el control de versiones de filas.

  • Se utilizan desencadenadores, MARS u operaciones de generación de índices en línea.

  • Se generan versiones de filas.

Nota

Cuando se invoca un desencadenador dentro de una transacción, las versiones de filas creadas por el desencadenador se mantienen hasta el final de la transacción, incluso cuando las versiones de filas dejan de necesitarse una vez completado el desencadenador. Esto también se aplica a las transacciones de lectura confirmada que usan el control de versiones de filas. Con este tipo de transacción, sólo se necesita una vista de la base de datos transaccionalmente coherente para cada instrucción de la transacción. De este modo, las versiones de filas creadas para una instrucción de la transacción dejan de necesitarse una vez completada la instrucción. No obstante, las versiones de filas creadas por cada instrucción de la transacción se mantienen hasta que finaliza la transacción.

Cuando tempdb se queda sin espacio, Motor de base de datos fuerza la reducción de los almacenes de versiones. Durante el proceso de reducción, las transacciones de mayor duración que todavía no han generado versiones de filas se marcan como sujetos. Se genera el mensaje 3967 en el registro de errores para cada transacción marcada como sujeto. Si una traducción se marca como sujeto, no podrá leer las versiones de filas del almacén de versiones. Cuando intenta leer versiones de filas, se genera el mensaje 3966 y la transacción se revierte. Si el proceso de reducción se realiza correctamente, pasa a quedar espacio disponible en tempdb. Si no, tempdb se queda sin espacio y se produce lo siguiente:

  • Las operaciones de escritura continúan, pero no generan versiones. Aparece un mensaje informativo (3959) en el registro de errores, pero la transacción que escribe datos no se ve afectada.

  • Las transacciones que intentan obtener acceso a versiones de filas que no se generaron debido a una reversión completa de tempdb terminan en un error 3958.

Espacio utilizado en filas de datos

Cada fila de base de datos puede utilizar hasta 14 bytes al final de la fila para información del control de versiones de filas. La información del control de versiones de filas contiene el número de secuencia de la transacción que confirmó la versión y el puntero a la fila cuya versión se ha creado. Estos 14 bytes se agregan la primera vez que se modifica una fila o se inserta una nueva fila, si se cumple alguna de las siguientes condiciones:

  • La opción READ_COMMITTED_SNAPSHOT o ALLOW_SNAPSHOT_ISOLATION está en ON.

  • La tabla tiene un desencadenador.

  • Se utilizan conjuntos de resultados activos múltiples (MARS)

  • En la actualidad, se ejecutan en la tabla operaciones de compilación de índices en línea.

Estos 14 bytes se eliminan de la fila de base de datos la primera vez que se modifica la fila si se cumplen todas estas condiciones:

  • Las opciones READ_COMMITTED_SNAPSHOT y ALLOW_SNAPSHOT_ISOLATION están en OFF.

  • El desencadenador ya no existe en la tabla.

  • No se utiliza MARS.

  • No se ejecutan en ese momento operaciones de generación de índices en línea.

Si se utiliza alguna de las características del control de versiones de filas, puede que sea necesario asignar espacio de disco adicional para que la base de datos dé cabida a los 14 bytes por fila de base de datos. Al agregar información del control de versiones de filas puede provocarse la división de la página de índices o la asignación de una nueva página de datos si no hay suficiente especio disponible en la página actual. Por ejemplo, si la longitud media de fila es 100 bytes, los 14 bytes adicionales hacen que una tabla existente crezca hasta un 14 por ciento.

Si se reduce el factor de relleno, se puede impedir o reducir la fragmentación de las páginas de índice. Para ver información sobre la fragmentación de los datos e índices de una tabla o vista, puede usar DBCC SHOWCONTIG.

Espacio utilizado en objetos grandes

SQL Server Database Engine (Motor de base de datos de SQL Server) admite seis tipos de datos que pueden contener cadenas grandes de hasta dos gigabytes (GB) de longitud: nvarchar(max), varchar(max), varbinary(max), ntext, text e image. Las cadenas grandes almacenadas con estos tipos de datos se almacenan en una serie de fragmentos de datos que se vinculan a la fila de datos. La información del control de versiones de filas se almacena en cada uno de los fragmentos utilizados para almacenar estas cadenas grandes. Los fragmentos de datos son una colección de páginas dedicadas a objetos grandes en una tabla.

A medida que se agregan nuevos valores grandes a una base de datos, se asignan utilizando un máximo de 8.040 bytes de datos por fragmento. En versiones anteriores del Motor de base de datos se almacenaban hasta 8.080 bytes de datos ntext, text o image por fragmento.

Los datos de objetos grandes (LOB) ntext, text e image existentes no se actualizan para dejar espacio para la información del control de versiones de filas cuando una base de datos se actualiza a SQL Server desde una versión anterior de SQL Server. Sin embargo, la primera vez que se modifican los datos de LOB, se actualizan dinámicamente para habilitar el almacenamiento de información del control de versiones. Esto sucederá aunque no se generen versiones de filas. Una vez actualizados los datos de LOB, el número máximo de bytes almacenados por fragmento se reduce de 8.080 bytes a 8.040 bytes. El proceso de actualización es equivalente a eliminar el valor de LOB y volver a insertar el mismo valor. Los datos de LOB se actualizan aunque sólo se haya modificado un solo byte. Esta operación se realiza una sola vez para cada columna ntext, text o image, pero, dependiendo del tamaño de los datos de LOB, puede que cada operación genere gran cantidad de asignaciones de página y actividad de E/S. Puede que también se genere gran cantidad de actividad de registro si la modificación se registra por completo. Las operaciones WRITETEXT y UPDATETEXT se registran mínimamente si el modo de recuperación de la base de datos no se establece en FULL.

Los tipos de datos nvarchar(max), varchar(max) y varbinary(max) no están disponibles en versiones anteriores de SQL Server. Por lo tanto, no presentan problemas de actualización.

Debe asignarse suficiente espacio de disco para dar cabida a este requisito.

Supervisar el control de versiones de filas y el almacén de versiones

Para los procesos de supervisión del control de versiones de filas, almacén de versiones y aislamiento de instantánea en cuanto al rendimiento y otros problemas, SQL Server proporciona herramientas en forma de Vistas de administración dinámica (DMV) y contadores de rendimiento del Monitor de sistema de Windows.

DMV

Las siguientes DMV proporcionan información sobre el estado actual del sistema de tempdb y el almacén de versiones, así como de las transacciones que utilizan el control de versiones de filas.

sys.dm_db_file_space_usage. Devuelve información de uso del espacio para cada fila de la base de datos. Para obtener más información, vea sys.dm_db_file_space_usage (Transact-SQL).

sys.dm_db_session_space_usage. Devuelve la actividad de asignación y cancelación de asignación de páginas por sesión de la base de datos. Para obtener más información, vea sys.dm_db_session_space_usage (Transact-SQL).

sys.dm_db_task_space_usage. Devuelve la actividad de asignación y cancelación de asignación de páginas por tarea de la base de datos. Para obtener más información, vea sys.dm_db_task_space_usage (Transact-SQL).

sys.dm_tran_top_version_generators. Devuelve una tabla virtual para los objetos que producen la mayoría de las versiones del almacén de versiones. Agrupa las 256 longitudes de registro principales agregadas mediante su database_id y rowset_id. Use esta función para encontrar los principales consumidores del almacén de versiones. Para obtener más información, vea sys.dm_tran_top_version_generators (Transact-SQL).

sys.dm_tran_version_store. Devuelve una tabla virtual que muestra todos los registros de versión del almacén de versiones común. Para obtener más información, vea sys.dm_tran_version_store (Transact-SQL).

Nota

La ejecución de las funciones sys.dm_tran_top_version_generators y sys.dm_tran_version_store puede ser muy costosa, puesto que ambas consultan todo el almacén de versiones, que puede ser muy grande.

sys.dm_tran_active_snapshot_database_transactions. Devuelve una tabla virtual para todas las transacciones activas de todas las bases de datos en la instancia de SQL Server que utiliza el control de versiones de filas. Las transacciones del sistema no aparecen en esta DMV. Para obtener más información, vea sys.dm_tran_active_snapshot_database_transactions (Transact-SQL).

sys.dm_tran_transactions_snapshot. Devuelve una tabla virtual que muestra las instantáneas tomadas por cada transacción. La instantánea contiene el número de secuencia de las transacciones activas que utilizan el control de versiones de filas. Para obtener más información, vea sys.dm_tran_transactions_snapshot (Transact-SQL).

sys.dm_tran_current_transaction. Devuelve una sola fila que muestra información de estado relacionada con el control de versiones de filas de la transacción de la sesión actual. Para obtener más información, vea sys.dm_tran_current_transaction (Transact-SQL).

sys.dm_tran_current_snapshot. Devuelve una tabla virtual que muestra todas las transacciones activas en el momento en que se inicia la transacción actual de aislamiento de instantánea. Si la transacción actual utiliza aislamiento de instantánea, esta función no devuelve ninguna fila. sys.dm_tran_current_snapshot es igual que sys.dm_tran_transactions_snapshot, excepto que sólo devuelve las transacciones activas para la instantánea actual. Para obtener más información, vea sys.dm_tran_current_snapshot (Transact-SQL).

Contadores de rendimiento

Los contadores de rendimiento de SQL Server proporcionan información sobre el rendimiento del sistema afectado por los procesos de SQL Server. Los siguientes contadores de rendimiento supervisan tempdb y el almacén de versiones, así como las transacciones que utilizan el control de versiones de filas. Los contadores de rendimiento se encuentran en el objeto de rendimiento SQLServer:Transactions.

Espacio libre en tempdb (KB). Supervisa la cantidad, en kilobytes (KB), de espacio libre en la base de datos tempdb. Debe haber suficiente espacio libre en tempdb para controlar el almacén de versiones que admite aislamiento de instantánea.

La fórmula siguiente ofrece una estimación aproximada del tamaño del almacén de versiones. En el caso de transacciones de larga duración, puede que sea conveniente supervisar la velocidad de generación y limpieza para estimar el tamaño máximo del almacén de versiones.

[tamaño del almacén de versiones común] = 2 * [datos del almacén de versiones generados por minuto] * [mayor tiempo de ejecución (minutos) de la transacción]

El mayor tiempo de ejecución de transacciones no debe incluir generaciones de índices en línea. Dado que estas operaciones pueden llevar mucho tiempo en tablas muy grandes, las generaciones de índices en línea utilizan un almacén de versiones independiente. El tamaño aproximado del almacén de versiones de generaciones de índices en línea equivale a la cantidad de datos modificados en la tabla, incluidos todos los índices, mientras la generación de índices en línea esté activa.

Tamaño de almacén de versiones (KB). Supervisa el tamaño en KB de todos los almacenes de versiones. Esta información ayuda a determinar el espacio necesario para el almacén de versiones en la base de datos tempdb. La supervisión de este contador durante cierto tiempo proporciona una estimación útil del espacio adicional necesario para tempdb.

Velocidad de generación de versión (KB/seg.). Supervisa la velocidad de generación de versión en KB por segundo en todos los almacenes de versiones.

Velocidad de limpieza de versión (KB/seg.). Supervisa la velocidad de limpieza de versión en KB por segundo en todos los almacenes de versiones.

Nota

La información procedente de Velocidad de generación de versión (KB/seg.) y Velocidad de limpieza de versión (KB/seg.) se puede utilizar para predecir los requisitos de espacio de tempdb.

Recuento de unidad de almacén de versiones. Supervisa el recuento de unidades del almacén de versiones.

Creación de unidad de almacén de versiones. Supervisa el número total de unidades del almacén de versiones creadas para almacenar versiones de filas desde que se inició la instancia.

Truncamiento de unidad de almacén de versiones. Supervisa el número total de unidades del almacén de versiones truncadas desde que se inició la instancia. Una unidad del almacén de versiones se trunca cuando SQL Server determina que no se necesita ninguna de las filas de versiones almacenadas en la unidad del almacén de versiones para ejecutar transacciones activas.

Frecuencia de conflictos de actualización. Supervisa la frecuencia de las transacciones de instantánea que tienen conflictos de actualización con respecto al número total de transacciones de instantánea de actualización.

Tiempo mayor de ejecución de transacción. Supervisa el tiempo mayor de ejecución en segundos de cualquier transacción que utilice el control de versiones de filas. Esto permite determinar si una transacción se ejecuta durante una cantidad de tiempo desproporcionada.

Transacciones. Supervisa el número total de transacciones activas. No incluye las transacciones del sistema.

Transacciones de instantáneas. Supervisa el número total de transacciones de instantáneas activas.

Transacciones de instantáneas de actualización. Supervisa el número total de transacciones de instantáneas activas que realizan operaciones de actualización.

Transacciones de versión que no son instantáneas. Supervisa el número total de transacciones que no son instantáneas activas que generan registros de versión.

Nota

La suma de Transacciones de instantáneas de actualización y Transacciones de versión que no son instantáneas representa el número total de transacciones que participan en la generación de versiones. La diferencia entre Transacciones de instantáneas y Transacciones de instantáneas de actualización notifica el número de transacciones de instantáneas de sólo lectura.