Tables temporelles avec version gérée par le système avec tables optimisées en mémoireSystem-Versioned Temporal Tables with Memory-Optimized Tables

S’applique à :Applies to: ouiSQL Server 2016 (13.x)SQL Server 2016 (13.x)yesSQL Server 2016 (13.x)SQL Server 2016 (13.x) et ultérieures OuiAzure SQL DatabaseAzure SQL DatabaseYesAzure SQL DatabaseAzure SQL Database OuiAzure SQL Managed InstanceAzure SQL Managed InstanceYesAzure SQL Managed InstanceAzure SQL Managed InstanceS’applique à :Applies to: ouiSQL Server 2016 (13.x)SQL Server 2016 (13.x)yesSQL Server 2016 (13.x)SQL Server 2016 (13.x) and later OuiAzure SQL DatabaseAzure SQL DatabaseYesAzure SQL DatabaseAzure SQL Database OuiAzure SQL Managed InstanceAzure SQL Managed InstanceYesAzure SQL Managed InstanceAzure SQL Managed Instance

Les tables temporelles à système par version pour les tables optimisées en mémoire sont conçues pour fournir une solution rentable dans des scénarios où l’audit de données et l’analyse à un moment donné sont nécessaires sur des données collectées à l’aide de charges de travail OLTP en mémoire.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. Elles offrent un débit transactionnel élevé et une simultanéité sans verrouillage, ainsi que la possibilité de stocker un grand nombre de données d’historique pouvant être interrogées facilement.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.

Vue d’ensembleOverview

Les tables temporelles à système par version conservent automatiquement un historique complet des modifications apportées aux données et exposent des extensions Transact-SQL utiles pour l’analyse à un moment donné.System-versioned temporal tables automatically keep a full history of data changes and expose convenient Transact-SQL extensions for point in time analysis. Dans un scénario classique, l’historique des données est conservé pendant très longtemps (plusieurs mois, voire années), même s’il n’est pas régulièrement interrogé.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.

L’audit de données et l’analyse à un moment donné peuvent être exigés dans différents environnements, notamment dans les systèmes OLTP qui traitent un grand nombre de requêtes et où la technologie OLTP en mémoire est mise en œuvre.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. Toutefois, l’utilisation de tables optimisées en mémoire dans des scénarios temporels est complexe, car une grande quantité de données d’historique générées excède généralement la limite de mémoire 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. Pourtant, stocker dans la RAM des données d’historique en lecture seule qui sont moins sollicitées avec le temps n’est pas une solution optimale.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.

Les tables temporelles à système par version des tables optimisées en mémoire fournissent un débit transactionnel élevé et une simultanéité sans verrouillage, ainsi que la possibilité de stocker un grand nombre de données d’historique en utilisant des tables en mémoire pour stocker les données actuelles (la table temporelle) et des tables sur disque pour les données d’historique.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. L’impact sur les opération DML est réduit au minimum grâce à l’utilisation d’un table de mise en lots interne optimisée en mémoire et générée automatiquement qui stocke l’historique récent et permet aux DML de s’exécuter à partir du code compilé en mode natif.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.

Le diagramme suivant illustre cette architecture. Architecture en mémoire temporelleThe following diagram illustrates this architecture.Temporal In-Memory Architecture

Informations d’implémentationImplementation Details

Les points suivants sur les tables temporelles à système par version avec tables optimisées en mémoire sont des considérations à connaître lors de la création d’une table à système par version à mémoire optimisée.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. Pour connaître les options de syntaxe et un exemple, consultez CREATE TABLE (Transact-SQL).For syntax options and for an example, see CREATE TABLE (Transact-SQL).

  • Seules les tables durables optimisées en mémoire peuvent être des tables à système par version (DURABILITY = SCHEMA_AND_DATA).Only durable memory-optimized tables can be system-versioned (DURABILITY = SCHEMA_AND_DATA).
  • La table d’historique de la table à système par version optimisée en mémoire doit être sur disque, qu’elle soit créée par l’utilisateur final ou le système.History table for memory-optimized system-versioned table must be disk-based, regardless if it was created by the end user or the system.
  • Les requêtes qui affectent uniquement la table active (en mémoire) peuvent être utilisées dans des modules T-SQL compilés en mode natif.Queries that affect only the current table (in-memory) can be used in natively compiled T-SQL modules. Les requêtes temporelles utilisant la clause FOR SYSTEM TIME ne sont pas prises en charge dans les modules compilés en mode natif.Temporal queries using the FOR SYSTEM TIME clause are not supported in natively compiled modules. L’utilisation de la clause FOR SYSTEM TIME avec les tables optimisées en mémoire dans les requêtes ad hoc et les modules non natifs est prise en charge.Use of the FOR SYSTEM TIME clause with memory-optimized tables in ad hoc queries and non-native modules is supported.
  • Quand SYSTEM_VERSIONING = ON, une table de mise en lots interne optimisée en mémoire est automatiquement créée pour accepter les dernières modifications apportées à la table à système par version qui résultent d’opérations de mise à jour et de suppression sur la table optimisée en mémoire actuelle.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.
  • Les données de la table de mise en lots interne optimisée en mémoire sont régulièrement déplacées vers la table d’historique sur disque par la tâche de vidage de données asynchrones.Data from the internal memory-optimized staging table is regularly moved to the disk-based history table by the asynchronous data flush task. Ce mécanisme de vidage des données vise à maintenir les mémoires tampons internes à moins de 10 % de la consommation de mémoire de leurs objets parents.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. Vous pouvez suivre la consommation de mémoire totale de la table temporelle à système par version optimisée en mémoire en interrogeant sys.dm_db_xtp_memory_consumers (Transact-SQL) et en résumant les données de la table de mise en lots interne optimisée en mémoire et de la table temporelle actuelle.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.
  • Vous pouvez appliquer un vidage des données en appelant sp_xtp_flush_temporal_history.You can enforce a data flush by invoking sp_xtp_flush_temporal_history.
  • Quand SYSTEM_VERSIONING = OFF ou quand le schéma de la table à système par version est modifié par l’ajout, la suppression ou le changement de colonnes, tout le contenu de la mémoire tampon de mise en lots interne est déplacé vers la table d’historique sur disque.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.
  • L’interrogation des données d’historique est en réalité sous le niveau d’isolement de capture instantanée et renvoie toujours une union entre la mémoire tampon de mise en lots en mémoire et la table sur disque sans doublons.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.
  • Les opérationsALTER TABLE qui modifient le schéma de la table en interne doivent effectuer un vidage de données, ce qui peut allonger la durée de l’opération.ALTER TABLE operations that change the table schema internally must perform a data flush, which may prolong the duration of the operation.

La table de mise en lots interne optimisée en mémoireThe Internal Memory-Optimized Staging Table

La table de mise en lots interne optimisée en mémoire est un objet interne créé par le système pour optimiser les opérations DML.The internal memory-optimized staging table is an internal object that is created by the system to optimize DML operations.

  • Le nom de la table est généré au format suivant : Memory_Optimized_History_Table_<ID_objet> , où <ID_objet> est l’identificateur de la table temporelle actuelle.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 table réplique le schéma de la table temporelle actuelle et une colonne BIGINT.The table replicates the schema of current temporal table plus one BIGINT column. Cette colonne supplémentaire garantit l’unicité des lignes déplacées vers la mémoire tampon de l’historique interne.This additional column guarantees the uniqueness of the rows moved to internal history buffer.
  • La colonne supplémentaire est au format suivant : Change_ID[_] , où _<suffix> est éventuellement ajouté dans les cas où la table contient déjà une colonne 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.
  • La taille de ligne maximale pour une table à système par version optimisée en mémoire est réduite de 8 octets en raison de la colonne BIGINT supplémentaire dans la table de mise en lots.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. La nouvelle valeur maximale est désormais 8 052 octets.The new maximum is now 8052 bytes.
  • La table de mise en lots interne optimisée en mémoire n’est pas représentée dans l’Explorateur d’objets de SQL Server Management Studio.The internal memory-optimized staging table is not represented in Object Explorer of SQL Server Management Studio.
  • Les métadonnées relatives à cette table, ainsi que sa connexion à la table temporelle actuelle, sont disponibles dans sys.internal_tables (Transact-SQL).Metadata about this table as well as its connection with current temporal table can be found in sys.internal_tables (Transact-SQL).

Tâche de vidage de donnéesThe Data Flush Task

Le vidage des données est une tâche régulièrement activée qui recherche si une table optimisée en mémoire répond à une condition basée sur la taille de mémoire pour le déplacement des données.The data flush is a regularly activated task that checks whether any memory-optimized table meets a memory size-based condition for data movement. Le déplacement des données commence lorsque la consommation de mémoire de la table de mise en lots interne atteint 8 % de la consommation de mémoire de la table temporelle actuelle.Data movement starts when memory consumption of internal staging table reaches 8% of memory consumption of current temporal table.

La tâche de vidage de données est activée régulièrement selon une planification qui varie en fonction de la charge de travail existante.The data flush task is activated regularly with a schedule that varies based on the existing workload. Sa fréquence peut aller de toutes les minutes pour une charge de travail légère à toutes les 5 secondes pour une charge de travail lourde.With a heavy workload, as frequent as every 5 seconds, and with a light workload, as infrequent as every 1 minute. Un thread est généré pour chaque table de mise en lots interne optimisée en mémoire qui doit être nettoyée.One thread is spawned for each internal memory-optimized staging table that needs cleanup.

Le vidage de données supprime tous les enregistrements de la mémoire tampon interne en mémoire antérieurs à la plus ancienne des transactions en cours d’exécution et les déplace vers la table d’historique sur disque.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.

Vous pouvez appliquer un vidage des données en appelant sp_xtp_flush_temporal_history et en spécifiant le schéma et le nom de la table : **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**. Cette commande exécutée par l’utilisateur fait appel au même processus de déplacement de données que lorsque la tâche de vidage de données est appelée par le système selon la planification interne.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.

Voir aussiSee Also