Introduction aux tables optimisées en mémoire
Les tables optimisées en mémoire sont des tables créées à l’aide de CREATE TABLE (Transact-SQL).
Par défaut, les tables optimisées en mémoire sont entièrement persistantes. Comme les transactions sur des tables (traditionnelles) basées sur disque, les transactions sur des tables optimisées en mémoire sont entièrement atomiques, cohérentes, isolées et persistantes (ACID). Les tables optimisées en mémoire et les procédures stockées compilées nativement ne supportent qu’un sous-ensemble des fonctionnalités Transact-SQL.
Depuis SQL Server 2016 et dans Azure SQL Database, il n’y a aucune restriction sur la collation ou les pages de codes spécifiques à l’OLTP en mémoire.
La mémoire primaire d’une table optimisée en mémoire est la mémoire principale. Lisez les lignes du tableau de mémoire et écrivez ces lignes en mémoire. Une autre copie des données de la table est conservée sur disque, mais uniquement pour des raisons de persistance. Pour plus d’informations sur les tables persistantes, voir Créer et gérer le stockage d’objets pour optimiser la mémoire. Les données dans les tables optimisées en mémoire ne sont lues sur le disque que lors de la récupération de la base de données (par exemple, après un redémarrage du serveur).
Pour des gains de performance plus importants, l’OLTP en mémoire prend en charge les tables persistantes avec une latence transactionnelle persistante. Les transactions persistantes retardées sont sauvegardées sur le disque peu après l’engagement de la transaction et le contrôle est rendu au client. En échange d’une amélioration des performances, les transactions engagées qui ne sont pas enregistrées sur le disque sont perdues en cas de plantage ou de basculement du serveur.
En plus des tables persistantes optimisées en mémoire par défaut, SQL Server prend en charge les tables non enregistrées non répétées et optimisées en mémoire, et leurs données ne sont pas conservées sur le disque. Cela signifie que les transactions sur ces tables ne nécessitent aucune sortie de disque, mais en cas de défaillance serveur ou de basculement, les données sont perdues.
L’OLTP en mémoire s’intègre à SQL Server pour offrir une expérience fluide à travers tous les aspects tels que le développement, le déploiement, la gestion et la supportabilité. Une base de données peut contenir à la fois des objets en mémoire et des objets sur disque.
Les lignes de la table optimisée en mémoire sont versionnées. Cela signifie que chaque ligne du tableau peut avoir plusieurs versions. Toutes les versions de lignes sont maintenues dans la même structure de données de tableau. Le versionnement de lignes est utilisé pour permettre des lectures et écritures simultanées sur la même ligne. Pour plus d’informations sur les lectures et écritures concurrentes sur la même ligne, voir Éléments dans la table d’optimisation de la mémoire.
Étapes approximatives et limitations d’utilisation
Escalier:
(1) Créer une base de données et MEMORY_OPTIMIZED_DATA groupe de fichiers (modifier la base de données ajouter un groupe de fichiers, chaque base de données ne peut avoir qu’un seul groupe de fichiers MEMORY_OPTIMIZED_DATA !!) ) (2) Ajouter un dossier au groupe de fichiers pour stocker les fichiers de données (merci de ne pas créer ce dossier à l’avance, utilisez modifier database add file() to filegroup) (3) Créer des tables persistantes/non persistantes optimisées en mémoire (SQL Server 2014 est persisté par défaut), et vous devez également définir une clé primaire basée sur un indice de hachage non agrégé. Les index hachés sont le seul type d’index pris en charge dans les tables optimisées en mémoire. (4) Utiliser des procédures stockées compilées localement : Les tables optimisées en mémoire prennent en charge les procédures stockées compilées localement, tant que ces procédures ne font référence qu’à des tables optimisées en mémoire.
Limite:
(1) La table optimisée en mémoire doit être placée sous la base de données avec le groupe de fichiers CONTAINS MEMORY_OPTIMIZED_DATA. (2) La table optimisée en mémoire doit définir une clé primaire basée sur un indice de hachage non agrégé, et la table doit être définieLa vérification de clé étrangère ou de contraintes n’est pas prise en charge (3) La table d’optimisation mémoire doit avoir suffisamment de mémoire, sinon des opérations telles que l’insertion de mises à jour échoueront. (4) SQL Server 2014 présente de nombreuses limitations concernant ces tableaux. Par exemple, ils ne prennent pas en charge les clés étrangères ni la vérification des contraintes (ce qui ressemble au moteur de stockage mémoire de MySQL), ilsLes champs IDENTITY ou les déclencheurs DML ne sont pas non plus pris en charge。
Utilisez le tutoriel
Les versions de la base de données sont les suivantes :
Microsoft SQL Server 2022 (RTM-CU15-GDR) (KB5046059) - 16.0.4150.1 (X64) 25 sept. 2024 17:34:41 Droits d’auteur (C) 2022 Microsoft Corporation Édition Enterprise : Licences basées sur les cœurs (64 bits) sous Linux (Ubuntu 22.04.4 LTS) <X64>
Tout d’abord, créez une base de données et un groupe de fichiers avec la commande suivante :
Si vous ne créez pas un groupe optimisé en mémoire, une erreur sera signalée lors de la création d’une table optimisée en mémoire :Impossible de créer des tables optimisées en mémoire. Pour créer des tables optimisées en mémoire, la base de données doit disposer d’un MEMORY_OPTIMIZED_FILEGROUP en ligne et d’au moins un conteneur.
Créez deux tables optimisées en mémoire pour tester, l’une persistante et l’autre non persistante, avec la commande suivante :
La table d’optimisation mémoire propose deux options (DURABILITÉ = SCHEMA_AND_DATA), (DURABILITÉ = SCHEMA_ONLY) Tableau de durabilité : DURABILITÉ =SCHEMA_AND_DATA Tableau non persistant : DURABILITÉ =SCHEMA_ONLY
Les tests sont insérés séparément dans la table d’optimisation mémoire100 000 articles(en réalité 100002 des éléments), la commande est la suivante :
La persistance met 28 secondes à s’activer et 1 seconde sans persistance。
Référence:
La connexion hyperlientérée est visible.
La connexion hyperlientérée est visible.
La connexion hyperlientérée est visible.
La connexion hyperlientérée est visible.
La connexion hyperlientérée est visible. |