Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Se aplica a: SQL Server 2016 (13.x) y versiones posteriores
de Azure SQL Managed Instance
Las tablas temporales versionadas por sistema para tablas optimizadas en memoria proporcionan una solución rentable para escenarios donde se requiere auditoría de datos y análisis puntual sobre los datos recogidos con cargas de trabajo OLTP en memoria.
Note
Las tablas temporales optimizadas para memoria solo están disponibles en SQL Server y Azure SQL Managed Instance. Las tablas y tablas temporales optimizadas para memoria están disponibles de forma independiente en Azure SQL Database.
Overview
Las tablas temporales versionadas por el sistema mantienen automáticamente un historial completo de los cambios en los datos y ofrecen útiles extensiones de Transact-SQL para el análisis de un momento dado. En un escenario típico, el historial de datos se conserva durante mucho tiempo (varios meses, incluso años), aunque no se consulte regularmente.
La auditoría de datos y el análisis basado en tiempo pueden exigirse en diferentes entornos, especialmente en sistemas OLTP que procesan un número extremadamente grande de solicitudes y donde se utiliza tecnología OLTP en memoria. Pero el uso de tablas optimizadas para memoria en escenarios temporales resulta difícil porque una enorme cantidad de datos históricos generados suele superar el límite de memoria RAM disponible. Al mismo tiempo, la utilización de RAM para almacenar datos históricos de solo lectura a los que se accede como menos frecuencia a medida que son más antiguos no constituye una solución óptima.
Las tablas temporales con control de versiones del sistema para tablas con optimización para memoria proporcionan un alto rendimiento transaccional y simultaneidad sin bloqueos. Puedes almacenar una gran cantidad de datos históricos usando tablas en memoria para almacenar datos actuales (la tabla temporal) y tablas basadas en disco para datos históricos. El efecto en las operaciones DML se reduce mediante el uso de una tabla de almacenamiento provisional interna optimizada para memoria y generada automáticamente que almacena el historial reciente y permite que los DML se ejecuten desde código compilado de manera nativa.
En el diagrama siguiente se muestra esta arquitectura.
Detalles de la implementación
Al crear una tabla optimizada para memoria con control de versiones del sistema, tenga en cuenta las consideraciones siguientes. Para obtener opciones de sintaxis y para obtener un ejemplo, vea CREATE TABLE.
Solo se puede usar el control de versiones del sistema en tablas duraderas optimizadas para memoria (
DURABILITY = SCHEMA_AND_DATA).La tabla de historial de una tabla con control de versiones del sistema con optimización para memoria debe basarse en disco, tanto si la crea como si la crea el sistema.
Puedes usar consultas que afecten solo a la tabla actual en memoria en módulos T-SQL compilados nativamente. Los módulos compilados nativamente no soportan la
FOR SYSTEM TIMEcláusula, pero las consultas ad hoc y los módulos no nativos pueden usar la cláusula contra tablas optimizadas para memoria.Con
SYSTEM_VERSIONING = ON, el sistema crea automáticamente una tabla interna de almacenamiento provisional optimizada para la memoria para aceptar los cambios versionados por el sistema más recientes, que son el resultado de operaciones de actualización y eliminación en una tabla actual optimizada para la memoria.Una tarea de vaciado de datos asincrónica traslada los datos de la tabla provisional interna con optimización para memoria a la tabla de historial basada en disco. Este mecanismo de vaciado de datos mantiene los búferes de memoria interna a menos del 10 % del consumo de memoria de sus objetos primarios. Puede hacer un seguimiento del consumo de memoria total de una tabla temporal con control de versiones del sistema con optimización para memoria si realiza una consulta a sys.dm_db_xtp_memory_consumers y resume los datos de la tabla de almacenamiento provisional interna con optimización para memoria y la tabla temporal actual.
Para realizar manualmente un vaciado de datos, ejecuta sp_xtp_flush_temporal_history.
Con
SYSTEM_VERSIONING = OFF, o cuando se modifica el esquema de una tabla con versiones administradas por el sistema agregando, eliminando o modificando columnas, todo el contenido del búfer de ensayo interno se traslada a la tabla de historial almacenada en disco.La consulta de los datos de historial se produce en el nivel de aislamiento de instantánea y siempre devuelve una unión entre el búfer de almacenamiento provisional en memoria y la tabla basada en disco sin duplicados.
ALTER TABLELas operaciones que cambian el esquema de la tabla internamente deben realizar un vaciado de datos, lo que podría prolongar la operación.
Tabla interna de ensayo optimizada para memoria
El sistema crea una tabla de ensayo interna optimizada para la memoria para optimizar las operaciones DML.
El nombre de la tabla utiliza el siguiente formato:
Memory_Optimized_History_Table_<object_id>donde<object_id>es el identificador de la tabla temporal actual.La tabla replica el esquema de la tabla temporal actual más una columna bigint . Esta columna extra garantiza la unicidad de las filas movidas al búfer de historial interno.
La columna adicional tiene el siguiente formato de nombre:
Change_ID[<suffix>], donde<suffix>se agrega de manera opcional en el caso de que la tabla ya cuente con una columnaChange_ID.El tamaño máximo de fila de una tabla optimizada para memoria con control de versiones del sistema se reduce en 8 bytes debido a la columna bigint adicional de la tabla de almacenamiento provisional. El máximo es ahora de 8.052 bytes.
La tabla de ensayo interna optimizada para memoria no aparece en el Explorador de objetos de SQL Server Management Studio.
Puedes encontrar metadatos sobre esta tabla y su conexión con la tabla temporal actual en sys.internal_tables.
La tarea de vaciado de datos
La tarea de vaciado de datos se ejecuta regularmente, y eso verifica si alguna tabla optimizada para memoria cumple una condición basada en el tamaño de memoria para el movimiento de datos. El movimiento de datos comienza cuando el consumo de memoria de la tabla de almacenamiento provisional interna alcanza el ocho por ciento del consumo de memoria de la tabla temporal en uso.
La tarea de vaciado de datos se activa periódicamente con una programación que varía según la carga de trabajo existente. Con una carga de trabajo intensiva, la tarea se ejecuta con una frecuencia máxima de hasta 5 segundos. Con una carga de trabajo ligera, la frecuencia aumenta a cada minuto. Se genera un subproceso para cada tabla de almacenamiento provisional optimizada para memoria que necesite limpieza.
El vaciado de datos elimina todos los registros del búfer interno en memoria que son posteriores a la transacción más antigua en ejecución en ese momento para mover esos registros a la tabla de historial basada en disco.
Puede ejecutar un vaciado de datos, si ejecuta sp_xtp_flush_temporal_history y especifica el esquema y el nombre de la tabla:
EXEC sys.sp_xtp_flush_temporal_history <schema_name>, <object_name>;
Se invoca el mismo proceso de movimiento de datos que cuando el sistema invoca la tarea de vaciado de datos según su programación interna.
Contenido relacionado
- Tablas temporales
- Introducción a las tablas temporales con control de versiones del sistema
- Escenarios de uso de tablas temporales
- Comprobaciones de coherencia del sistema de la tabla temporal
- Creación de particiones con tablas temporales
- Consideraciones y limitaciones de las tablas temporales
- Seguridad de la tabla temporal
- Administrar la retención de datos históricos en las tablas temporales con versiones del sistema
- Funciones y vistas de metadatos de la tabla temporal