Tablas temporales con control de versiones del sistema con tablas con optimización para memoriaSystem-Versioned Temporal Tables with Memory-Optimized Tables

SE APLICA A: síSQL Server síAzure SQL Database noAzure SQL Data Warehouse noAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Las tablas temporales con control de versiones del sistema para tablas con optimización para memoria están diseñadas con el objetivo de ofrecer una solución rentable para escenarios donde se requieren auditorías de los datos y análisis puntales , además de los datos recopilados con cargas de trabajo de OLTP en memoria.System-versioned temporal tables for Memory-Optimized Tables are designed to provide cost-effective solution for scenarios where data audit and point in time analysis are required on top of data collected with In-Memory OLTP workloads. Ofrecen gran rendimiento transaccional, simultaneidad sin bloqueo y, al mismo tiempo, la capacidad de almacenar grandes cantidades de datos de historial en los que se pueden realizar consultas fácilmente.They provide high transactional throughput, lock-free concurrency and at the same time, ability to store large amount of history data that can be easily queried.

Información generalOverview

Las tablas temporales con control de versiones del sistema mantienen automáticamente un historial completo de los cambios de datos y exponen prácticas extensiones de Transact-SQL para los análisis puntuales.System-versioned temporal tables automatically keep a full history of data changes and expose convenient Transact-SQL extensions for point in time analysis. En un escenario típico, se conserva el historial de datos durante un periodo muy largo (varios meses, incluso años), aunque no se realicen consultas en él con regularidad.In a typical scenario, data history is retained for a very long period of time (multiple months, even years), even though it is not regularly queried.

Puede que se exijan auditorías de datos y análisis basados en el tiempo en distintos entornos, especialmente en sistemas OLTP que procesen un número de solicitudes muy elevado y donde se utilice la tecnología OLTP en memoria.Data audit and time-based analysis can be demanded in different environments, especially in OLTP systems that process extremely large numbers of requests and where In-Memory OLTP technology is used. Sin embargo, el uso de tablas optimizadas para memoria en escenarios temporales resulta difícil porque la enorme cantidad de datos históricos generados suele superar el límite de memoria RAM disponible.However, using memory-optimized tables in temporal scenarios is challenging because a huge amount of generated historical data commonly exceeds the limit of available RAM memory. 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 van adquiriendo más antigüedad no constituye una solución óptima.At the same time using RAM to store read-only historical data that is accessed less frequently as it becomes older is not an optimal solution.

Las tablas temporales con control de versiones del sistema para tablas optimizadas para memoria ofrecen un alto rendimiento transaccional, simultaneidad sin bloqueo y, al mismo tiempo, la capacidad de almacenar granes cantidades de datos de historial mediante tablas en memoria para guardar los datos actuales (la tabla temporal) y tablas basadas en disco para los históricos.System-versioned temporal tables for memory-optimized tables provide high transactional throughput, lock-free concurrency and at the same time, ability to store large amount of history data by using in-memory tables for storing current data (the temporal table) and disk-based tables for historical data. Se minimiza el impacto en las operaciones DML 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 las DML se ejecuten desde el código compilado de manera nativa.The impact on DML operations is minimalized through the use of an internal, auto-generated memory-optimized staging table that stores recent history and enables DMLs to be executed from natively compiled code.

El siguiente diagrama muestra esta arquitectura. Arquitectura en memoria temporalThe following diagram illustrates this architecture.Temporal In-Memory Architecture

Detalles de implementaciónImplementation Details

Los siguientes datos sobre las tablas temporales con control de versiones del sistema con tablas optimizadas para memoria son consideraciones que debe tener en cuenta a la hora de crear una tabla con control de versiones del sistema y optimizada para memoria.The following facts about system-versioned temporal tables with memory optimized tables are considerations of which you need to be aware when creating a system-versioned memory-optimized table. Para ver las opciones de sintaxis y obtener un ejemplo, consulte CREATE TABLE (Transact-SQL).For syntax options and for an example, see CREATE TABLE (Transact-SQL).

  • Solo se puede usar el control de versiones del sistema en tablas optimizadas para memoria duraderas (DURABILITY = SCHEMA_AND_DATA).Only durable memory-optimized tables can be system-versioned (DURABILITY = SCHEMA_AND_DATA).

  • La tabla de historial para la tabla con control de versiones del sistema optimizado para memoria debe ser basada en disco, al margen de si la creó el usuario final o el sistema.History table for memory-optimized system-versioned table must be disk-based, regardless if it was created by the end user or the system.

  • Las consultas que afectan solo a la tabla actual (en memoria) pueden usarse en módulos T-SQL compilados de forma nativa.Queries that affect only the current table (in-memory) can be used in natively compiled T-SQL modules. No se admiten consultas temporales con la cláusula FOR SYSTEM TIME en módulos compilados de forma nativa.Temporal queries using the FOR SYSTEM TIME clause are not supported in natively compiled modules. Se admite el uso de la cláusula FOR SYSTEM TIME con tablas optimizadas para memoria en consultas ad hoc y módulos no nativos.Use of the FOR SYSTEM TIME clause with memory-optimized tables in ad hoc queries and non-native modules is supported.

  • Cuando SYSTEM_VERSIONING = ON, se crea automáticamente una tabla de almacenamiento provisional interna optimizada para memoria a fin de aceptar los cambios con control de versiones del sistema más recientes, que son consecuencia de operaciones de actualización y eliminación en la tabla actual optimizada para memoria.When SYSTEM_VERSIONING = ON, an internal memory-optimized staging table is automatically created to accept the most recent system-versioned changes that are results of update and delete operations on memory-optimized current table.

  • La tarea de vaciado de datos asincrónica mueve con regularidad los datos de la tabla de almacenamiento provisional interna optimizada para memoria a la tabla de historial basada en disco.Data from the internal memory-optimized staging table is regularly moved to the disk-based history table by the asynchronous data flush task. Este mecanismo de vaciado de datos tiene el objetivo de mantener los búferes de memoria interna a menos del 10 % del consumo de memoria de sus objetos primarios.This data flush mechanism has a goal to keep the internal memory buffers at less than 10% of the memory consumption of their parent objects. Puede efectuar un seguimiento del consumo de memoria total de la tabla temporal con control de versiones del sistema y optimizado para memoria si realiza una consulta a sys.dm_db_xtp_memory_consumers (Transact-SQL) y resume los datos de la tabla de almacenamiento provisional interna optimizada para memoria y la tabla temporal actual.You can track the total memory consumption of memory-optimized system-versioned temporal table by querying sys.dm_db_xtp_memory_consumers (Transact-SQL) and summarizing the data for the internal memory-optimized staging table and the current temporal table.

  • Puede forzar un vaciado de datos invocando sp_xtp_flush_temporal_history.You can enforce a data flush by invoking sp_xtp_flush_temporal_history.

  • Cuando SYSTEM_VERSIONING = OFF o cuando se modifica el esquema de una tabla con control de versiones del sistema agregando, quitando o alterando columnas, todo el contenido del búfer de almacenamiento provisional interno se mueve a la tabla de historial basada en disco.When SYSTEM_VERSIONING = OFF or when schema of system-versioned table is modified by adding, dropping or altering columns, the entire contents of the internal staging buffer is moved into the disk-based history table.

  • La consulta de los datos de historial se produce en el nivel de aislamiento SNAPSHOT y siempre devuelve una unión entre el búfer de almacenamiento provisional en memoria y la tabla basada en disco sin duplicados.Querying of historical data is effectively under SNAPSHOT isolation level and always returns a union between in-memory staging buffer and disk-based table without duplicates.

  • Las operacionesALTER TABLE que cambian el esquema de tabla internamente deben realizar un vaciado de datos, lo que podría prolongar la duración de la operación.ALTER TABLE operations that change the table schema internally must perform a data flush, which may prolong the duration of the operation.

Tabla de almacenamiento provisional interna con optimización para memoriaThe Internal Memory-Optimized Staging Table

La tabla de almacenamiento provisional interna optimizada para memoria es un objeto interno que crea el sistema con la finalidad de optimizar las operaciones DML.The internal memory-optimized staging table is an internal object that is created by the system to optimize DML operations.

  • El nombre de tabla se genera en el formato siguiente: Memory_Optimized_History_Table_<object_id> , donde <object_id> es el identificador de la tabla temporal actual.The table name is generated in the following format: Memory_Optimized_History_Table_<object_id> where <object_id> is identifier of the current temporal table.

  • La tabla replica el esquema de la tabla temporal actual, más una columna BIGINT.The table replicates the schema of current temporal table plus one BIGINT column. Esta columna adicional garantiza la exclusividad de las filas trasladadas al búfer interno de historial.This additional column guarantees the uniqueness of the rows moved to internal history buffer.

  • La columna adicional tiene el formato de nombre siguiente: Change_ID[_< sufijo>] , donde _<sufijo> se agrega de manera opcional en el caso de que la tabla ya cuente con una columna Change_ID.The additional column has the following name format: Change_ID[_< suffix>], where _<suffix> is optionally added in the case where the table already has a Change_ID column.

  • El tamaño máximo de fila de una tabla con control de versiones del sistema y optimizada para memoria se reduce en 8 bytes debido a la columna BIGINT adicional de la tabla de almacenamiento provisional.The maximum row size for a system-versioned memory-optimized table is reduced by 8 bytes because of the additional BIGINT column in staging table. Ahora, el nuevo máximo es 8052 bytes.The new maximum is now 8052 bytes.

  • La tabla de almacenamiento provisional interna optimizada para memoria no se representa en el Explorador de objetos de SQL Server Management Studio.The internal memory-optimized staging table is not represented in Object Explorer of SQL Server Management Studio.

  • En sys.internal_tables (Transact-SQL), es posible encontrar metadatos sobre esta tabla, así como su conexión con la tabla temporal actual.Metadata about this table as well as its connection with current temporal table can be found in sys.internal_tables (Transact-SQL).

La tarea de vaciado de datosThe Data Flush Task

El vaciado de datos es una tarea que se activa con regularidad y que comprueba si la tabla optimizada para memoria cumple una condición basada en el tamaño de la memoria para el movimiento de los datos.The data flush is a regularly activated task that checks whether any memory-optimized table meets a memory size-based condition for data movement. El movimiento de los datos empieza cuando el consumo de memoria de la tabla de almacenamiento provisional interna alcanza el 8 % del de la tabla temporal.Data movement starts when memory consumption of internal staging table reaches 8% of memory consumption of current temporal table.

La tarea de vaciado de datos se activa periódicamente con una programación que varía según la carga de trabajo existente.The data flush task is activated regularly with a schedule that varies based on the existing workload. Con una gran carga de trabajo, tendrá una frecuencia de cada 5 segundos y con una carga de trabajo ligera, de cada 1 minuto.With a heavy workload, as frequent as every 5 seconds, and with a light workload, as infrequent as every 1 minute. Se genera un subproceso para cada tabla de almacenamiento provisional optimizada para memoria que necesite limpieza.One thread is spawned for each internal memory-optimized staging table that needs cleanup.

El vaciado de datos elimina todos los registros del búfer interno en memoria que sean posteriores a la transacción más antigua en ejecución en ese momento para mover dichos registros a la tabla de historial basada en disco.Data flush deletes all records from in-memory internal buffer that are older than the oldest currently running transaction to move these records to the disk-based history table.

Puede forzar un vaciado de los datos si invoca sp_xtp_flush_temporal_history y especifica el nombre de esquema y tabla: **sys.sp_xtp_flush_temporal_history @schema_name, @object_name** .You can enforce a data flush by invoking sp_xtp_flush_temporal_history and specifying the schema and table name: **sys.sp_xtp_flush_temporal_history @schema_name, @object_name**. Con este comando ejecutado por el usuario, se invoca el mismo proceso de movimiento de datos que cuando el sistema invoca la tarea de vaciado de datos según la programación interna.With this user-executed command, the same data movement process is invoked as when data flush task is invoked by the system on internal schedule.

Consulte tambiénSee Also