sql >> Base de Datos >  >> RDS >> Access

Creación y acceso a tablas y bases de datos OLTP en memoria

Este es el segundo artículo de una serie de artículos sobre SQL Server In-Memory OLTP.

El artículo introductorio:SQL Server In-Memory OLTP, presentó brevemente los conceptos básicos del nuevo motor Hekaton. En esta parte, nos centraremos en la práctica. Para ser más específicos, veremos cómo crear bases de datos y tablas optimizadas en memoria, y también cómo evaluarlas con la ayuda de T-SQL.

Requisitos previos para comenzar a usar bases de datos optimizadas para memoria

OLTP en memoria se instala automáticamente con una edición Enterprise o Developer de 64 bits de SQL Server 2014 o SQL Server 2016. La edición de 32 bits de SQL Server no proporciona componentes de OLTP en memoria.

Por lo tanto, si tiene instalada la edición Developer de SQL Server de 64 bits en su computadora, puede comenzar a crear bases de datos y estructuras de datos que almacenarán datos optimizados para memoria sin configuración de adiciones.

Cada base de datos que va a contener tablas optimizadas para memoria debe contener un grupo de archivos MEMORY_OPTIMIZED_DATA. Este grupo de archivos contiene uno o varios contenedores. Cada contenedor individual almacena datos y/o archivos delta. SQL Server usa estos archivos para recuperar las tablas optimizadas para memoria. Los contenedores se pueden colocar en las diferentes matrices de discos,
de manera similar a los grupos de archivos FILESTREAM.

La sintaxis para crear un grupo de archivos optimizado para memoria es casi la misma que para un grupo de archivos FILESTREAM tradicional, con varias diferencias:

  1. Solo se puede crear un grupo de archivos optimizado para memoria para una base de datos.
  2. La opción CONTAINS MEMORY_OPTIMIZED_DATA debe especificarse explícitamente.

Puede crear el grupo de archivos en el proceso de creación de una base de datos:

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'
)

Como alternativa, puede agregar el grupo de archivos MEMORY_OPTIMIZED_DATA a una base de datos existente y luego agregar archivos a ese grupo de archivos.

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

Internamente, In-Memory OLTP utiliza un mecanismo de transmisión basado en la tecnología FILESTREAM, que está bien adaptado para el acceso de E/S secuencial.

Creación de tablas optimizadas para memoria

Ahora, tenemos todo lo que necesitamos para comenzar a crear objetos optimizados para memoria. Vamos a crear una tabla optimizada para memoria.

La sintaxis para crear tablas optimizadas en memoria es muy similar a la de crear tablas basadas en disco. Sin embargo, existen algunas extensiones y restricciones:

  1. La cláusula MEMORY_OPTIMIZED =ON identifica una tabla como optimizada en memoria.
  2. Las tablas optimizadas en memoria no admiten todos los tipos de datos que admiten las tablas tradicionales. Los siguientes tipos de datos no son compatibles:
  • desplazamiento de fecha y hora
  • geografía
  • geometría
  • id de jerarquía
  • versión de fila
  • XML
  • variante_sql
  • Tipos definidos por el usuario

Se puede crear una tabla optimizada para memoria con los siguientes valores de durabilidad:SCHEMA_AND_DATA o SCHEMA_ONLY. SCHEMA_AND_DATA es el valor predeterminado.
En caso de que especifique SCHEMA_ONLY, todos los cambios en la tabla no se registrarán y los datos de la tabla no se almacenarán en el disco.

Cada tabla optimizada para memoria debe contener al menos un índice. Tenga en cuenta que la restricción PRIMARY KEY crea implícitamente un índice. Una tabla duradera optimizada para memoria siempre requiere una restricción 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);

Se pueden agregar índices compuestos cuando se hayan creado todas las columnas:

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);

Cuando crea la tabla optimizada en memoria, el motor OLTP en memoria crea rutinas DML para poder acceder a esa tabla. Carga rutinas como archivos DLL. Para una operación específica, SQL Server llama a un archivo DLL requerido.

Alteración de tablas e índices

Era imposible ALTERAR tablas antes de SQL Server 2016. Para realizar cambios en el esquema, tenía que eliminar y volver a crear la tabla en memoria.

En la nueva versión de SQL Server, ALTER TABLE es parcialmente compatible.

SQL Server 2016 le brinda la capacidad de realizar operaciones fuera de línea:agregar y eliminar (modificar) columnas, índices y restricciones. Además, ahora es posible trabajar con tablas en memoria mediante el diseñador de tablas SSMS o el editor de tablas dbForge Studio para SQL Server.

Tenga en cuenta que ALTER TABLE requiere la reconstrucción de la tabla. Es por eso que debe asegurarse de tener suficiente memoria antes de ejecutar esta operación. Durante la operación de reconstrucción, cada fila se reinserta en la nueva tabla y la tabla no está disponible mientras se realiza la operación ALTER.

Puede introducir varios cambios en una sola tabla y combinarlos en una única sentencia ALTER TABLE. Puede AGREGAR columnas, índices y restricciones y puede SOLTAR columnas, índices y restricciones. Tenga en cuenta que no puede combinar los comandos ADD y DROP en una sola 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

Tipos de tabla y variables de tabla

SQL Server 2016 le brinda la capacidad de crear tipos de tablas optimizadas para memoria que puede usar al definir una variable de tabla:

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

Esta variable solo se almacena en la memoria. Las tablas optimizadas en memoria y los tipos de tablas utilizan las mismas estructuras de datos, por lo que el acceso a los datos será más eficiente en comparación con las variables de tabla basadas en disco.

Para obtener más detalles, consulte la siguiente publicación de blog de MSDN:Mejora del rendimiento de tablas temporales y variables de tablas mediante la optimización de memoria

Resumen

In-Memory OLTP es una tecnología relativamente joven que está diseñada para funcionar con sistemas OLTP enormes y muy ocupados que admiten cientos o incluso miles de usuarios simultáneos. Se introdujo en SQL Server 2014 y evolucionó en SQL Server 2016.
Al mismo tiempo, la tecnología contiene una serie de restricciones y limitaciones.
No todas las funciones y tipos de datos de T-SQL son compatibles con la memoria. tablas optimizadas, dichas tablas no pueden contener filas que superen los 8060 bytes, y tampoco son compatibles con el almacenamiento
ROW-OVERFLOW y LOB. No puede modificar tablas e índices (en SQL Server 2014), una vez que se crea la tabla.
A pesar de esto, ¡esperamos que las versiones posteriores de In-Memory OLTP tengan menos limitaciones!

Leer también:

Uso de índices en tablas optimizadas para memoria de SQL Server


No