Access
 sql >> Base de données >  >> RDS >> Access

Création et accès aux bases de données et tables OLTP en mémoire

Ceci est le deuxième article d'une série d'articles sur SQL Server In-Memory OLTP.

L'article d'introduction - SQL Server In-Memory OLTP, a brièvement présenté les bases du nouveau moteur Hekaton. Dans cette partie, nous nous concentrerons sur la pratique. Pour être plus précis, nous verrons comment créer des bases de données et des tables optimisées en mémoire, et aussi comment les évaluer à l'aide de T-SQL.

Prérequis pour commencer à utiliser des bases de données à mémoire optimisée

L'OLTP en mémoire est automatiquement installé avec une édition Enterprise ou Developer 64 bits de SQL Server 2014 ou SQL Server 2016. L'édition 32 bits de SQL Server ne fournit pas de composants OLTP en mémoire.

Ainsi, si vous avez installé l'édition Developer 64 bits de SQL Server sur votre ordinateur, vous pouvez commencer à créer des bases de données et des structures de données qui stockeront des données optimisées en mémoire sans configuration supplémentaire.

Chaque base de données qui va contenir des tables à mémoire optimisée doit contenir un groupe de fichiers MEMORY_OPTIMIZED_DATA. Ce groupe de fichiers contient un ou plusieurs conteneurs. Chaque conteneur stocke des données et/ou des fichiers delta. SQL Server utilise ces fichiers pour récupérer les tables optimisées en mémoire. Les conteneurs peuvent être placés sur les différentes baies de disques,
comme pour les groupes de fichiers FILESTREAM.

La syntaxe de création d'un groupe de fichiers à mémoire optimisée est presque la même que pour un groupe de fichiers FILESTREAM traditionnel, à quelques différences près :

  1. Un seul groupe de fichiers à mémoire optimisée peut être créé pour une base de données.
  2. L'option CONTAINS MEMORY_OPTIMIZED_DATA doit être spécifiée explicitement.

Vous pouvez créer le groupe de fichiers lors du processus de création d'une base de données :

CREATE DATABASE InMemoryDemo
ON PRIMARY
(
NAME = N'InMemoryDemo',
FILENAME = N'D:\Data\InMemoryOLTPDemo.mdf'
),
FILEGROUP IMOFG CONTAINS MEMORY_OPTIMIZED_DATA
(
NAME = N'InMemoryDemo_Data',
FILENAME = N'D:\IMOFG\InMemoryDemo_Data.mdf'
)

Vous pouvez également ajouter le groupe de fichiers MEMORY_OPTIMIZED_DATA à une base de données existante, puis ajouter des fichiers à ce groupe de fichiers.

-- Adding the containers
ALTER DATABASE
  DemoDB ADD FILE
  (
  NAME = 'DemoDB_Mod',
  FILENAME = 'D:\Data\DemoDB_Mod'
  )
  TO FILEGROUP DemoDB_Mod

En interne, In-Memory OLTP utilise un mécanisme de streaming basé sur la technologie FILESTREAM, qui est bien adapté pour l'accès séquentiel aux E/S.

Création de tables optimisées en mémoire

Maintenant, nous avons tout ce dont nous avons besoin pour commencer à créer des objets optimisés en mémoire. Créons une table optimisée en mémoire.

La syntaxe de création de tables optimisées en mémoire est très similaire à celle utilisée pour créer des tables sur disque. Cependant, il existe quelques extensions et restrictions :

  1. La clause MEMORY_OPTIMIZED =ON identifie une table comme optimisée en mémoire.
  2. Les tables optimisées en mémoire ne prennent pas en charge tous les types de données pris en charge par les tables traditionnelles. Les types de données suivants ne sont pas pris en charge :
  • datetimeoffset
  • géographie
  • géométrie
  • hierarchyid
  • version de ligne
  • XML
  • sql_variant
  • Types définis par l'utilisateur

Une table optimisée en mémoire peut être créée avec les valeurs de durabilité suivantes :SCHEMA_AND_DATA ou SCHEMA_ONLY. SCHEMA_AND_DATA est la valeur par défaut.
Si vous spécifiez SCHEMA_ONLY, toutes les modifications apportées à la table ne seront pas enregistrées et les données de la table ne seront pas stockées sur le disque.

Chaque table optimisée en mémoire doit contenir au moins un index. Notez que la contrainte PRIMARY KEY crée implicitement un index. Une table durable optimisée en mémoire nécessite toujours une contrainte PRIMARY KEY.

CREATE TABLE dbo.Person (
  [Name] VARCHAR(32) NOT NULL PRIMARY KEY NONCLUSTERED
 ,[City] VARCHAR(32) NULL
 ,[Country] VARCHAR(32) NULL
 ,[State_Province] VARCHAR(32) NULL
 ,[LastModified] DATETIME NOT NULL
) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA);

Des index composites peuvent être ajoutés lorsque toutes les colonnes ont été créées :

CREATE TABLE dbo.Person (
  [Name] VARCHAR(32) NOT NULL PRIMARY KEY NONCLUSTERED
 ,[City] VARCHAR(32) NULL
 ,[Country] VARCHAR(32) NULL
 ,[State_Province] VARCHAR(32) NULL
 ,[LastModified] DATETIME NOT NULL
 ,INDEX T1_INDX_C1C2 NONCLUSTERED ([Name], [City])
) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA);

Lorsque vous créez la table optimisée en mémoire, le moteur OLTP en mémoire crée des routines DML pour pouvoir accéder à cette table. Il charge les routines sous forme de fichiers DLL. Pour une opération spécifique, SQL Server appelle un fichier DLL requis.

Modification des tables et des index

Il était impossible de modifier les tables avant SQL Server 2016. Pour apporter des modifications au schéma, vous deviez supprimer et recréer la table en mémoire.

Dans la nouvelle version de SQL Server, ALTER TABLE est partiellement pris en charge.

SQL Server 2016 vous offre la possibilité d'effectuer des opérations hors ligne :ajouter et supprimer (modifier) ​​des colonnes, des index et des contraintes. De plus, il est désormais possible de travailler avec des tables en mémoire à l'aide du concepteur de tables SSMS ou de l'éditeur de tables dbForge Studio for SQL Server.

Notez que ALTER TABLE nécessite la reconstruction de la table. C'est pourquoi vous devez vous assurer que vous disposez de suffisamment de mémoire avant d'exécuter cette opération. Pendant l'opération de reconstruction, chaque ligne est réinsérée dans la nouvelle table et la table n'est pas disponible pendant l'exécution de l'opération ALTER.

Vous pouvez introduire plusieurs modifications dans une même table et les combiner dans une seule instruction ALTER TABLE. Vous pouvez AJOUTER des colonnes, des index et des contraintes et vous pouvez SUPPRIMER des colonnes, des index et des contraintes. Notez que vous ne pouvez pas combiner les commandes ADD et DROP dans un seul ALTER TABLE.

-- index operations
-- change hash index bucket count
ALTER TABLE dbo.TableName ALTER INDEX IX_Name REBUILD WITH (BUCKET_COUNT = 131072);
GO
-- add index
ALTER TABLE dbo.TableName ADD INDEX IX_Name NONCLUSTERED (ColName);
GO
-- drop index
ALTER TABLE dbo.TableName DROP INDEX IX_Name;
GO
-- add multiple indexes
ALTER TABLE dbo.TableName ADD INDEX IX_Name NONCLUSTERED (ColName),
 INDEX IX_Name2 NONCLUSTERED (ColName2);
GO
-- Add a new column and an index 
ALTER TABLE dbo.TableName ADD Date DATETIME, INDEX IX_Name NONCLUSTERED (ColName);
GO
-- Drop a column
ALTER TABLE dbo.TableName DROP COLUMN ColName;
GO

Types de tableau et variables de tableau

SQL Server 2016 vous offre la possibilité de créer des types de table à mémoire optimisée que vous pouvez utiliser lors de la définition d'une variable de table :

CREATE TYPE TypeName
AS TABLE (
Col1 SMALLINT NOT NULL,
Col2 INT NOT NULL,
Col3 INT NOT NULL,
Col4 INT NOT NULL,
INDEX IX_Col1 NONCLUSTERED HASH (Col1)
WITH (BUCKET_COUNT = 131072),
INDEX IX_Col1 NONCLUSTERED (Col2))
WITH (MEMORY_OPTIMIZED = ON);
GO
DECLARE @VariableName TypeName;
GO

Cette variable est uniquement stockée en mémoire. Les tables optimisées en mémoire et les types de table utilisent les mêmes structures de données, de sorte que l'accès aux données sera plus efficace par rapport aux variables de table sur disque.

Pour plus de détails, veuillez vous référer au billet de blog MSDN suivant :Amélioration des performances des tables temporaires et des variables de table à l'aide de l'optimisation de la mémoire

Résumé

L'OLTP en mémoire est une technologie relativement jeune conçue pour fonctionner avec des systèmes OLTP énormes et très occupés qui prennent en charge des centaines, voire des milliers d'utilisateurs simultanés. Il a été introduit dans SQL Server 2014 et a évolué dans SQL Server 2016.
Dans le même temps, la technologie contient un certain nombre de restrictions et de limitations.
Toutes les fonctionnalités et tous les types de données T-SQL ne sont pas pris en charge par la mémoire. tables optimisées, ces tables ne peuvent pas contenir de lignes dépassant 8060 octets et ne prennent pas non plus en charge
ROW-OVERFLOW et le stockage LOB. Vous ne pouvez pas modifier les tables et les index (dans SQL Server 2014), une fois la table créée.
Malgré cela, nous nous attendons à ce que les prochaines versions d'OLTP en mémoire aient moins de limitations !

Lire aussi :

Utilisation des index dans les tables optimisées en mémoire SQL Server


No