Encuesta de áreas iniciales de OLTP en memoria
Se aplica a: SQL Server Azure SQL Database Azure SQL Managed Instance
Este artículo está destinado a los desarrolladores que necesitan aprender rápidamente los conceptos básicos de las características de rendimiento de OLTP en memoria de Microsoft SQL Server y Base de datos SQL de Azure.
Para OLTP en memoria, este artículo incluye lo siguiente:
- Breves explicaciones de las características.
- Ejemplos de código principal que implementan las características.
SQL Server y Base de datos SQL presentan solo pequeñas variaciones en su compatibilidad con tecnologías en memoria.
En su ámbito, algunos blogueros hacen referencia a las características de OLTP en memoria como Hekaton.
Ventajas de las características en memoria
SQL Server proporciona características en memoria que pueden mejorar considerablemente el rendimiento de muchos sistemas de aplicaciones. En esta sección se describen las consideraciones más sencillas.
Características de OLTP (procesamiento de transacciones en línea)
Los sistemas que deben procesar simultáneamente grandes cantidades de instrucciones INSERT de SQL son los candidatos perfectos para las características de OLTP.
- Nuestras pruebas comparativas muestran que la velocidad se puede multiplicar entre 5 y 20 veces con la adopción de las características en memoria.
Los sistemas que procesan cálculos intensivos en Transact-SQL son candidatos ideales.
- Un procedimiento almacenado que se dedica a cálculos intensivos se puede ejecutar hasta 99 veces más rápido.
Más tarde tal vez le interese visitar los siguientes artículos, que ofrecen demostraciones de las mejoras de rendimiento de OLTP en memoria:
- Demostración: mejora de rendimiento de OLTP en memoria ofrece una demostración a pequeña escala de las posibles mejoras de rendimiento más grandes.
- Sample Database for In-Memory OLTP (Base de datos de ejemplo para OLTP en memoria) ofrece una demostración de escala mayor.
Características de análisis operativo
El análisis en memoria hace referencia a instrucciones SELECT de SQL que agregan datos transaccionales, normalmente mediante la inclusión de una cláusula GROUP BY. El tipo de índice denominado columnstore es fundamental para el análisis operativo.
Hay dos escenarios principales:
- Elanálisis operativo por lotes hace referencia a los procesos de agregación que se ejecutan cuando finaliza el horario laboral o bien en hardware secundario que tiene copias de los datos transaccionales.
- Azure Synapse Analytics también se asocia con el análisis operativo por lotes.
- El análisis operativo en tiempo real hace referencia a los procesos de agregación que se ejecutan en horario laboral y en el hardware principal que se usa para cargas de trabajo transaccionales.
El presente artículo se centra en OLTP y no en el análisis. Para obtener información sobre cómo los índices de almacén de columnas llevan el análisis a SQL, vea:
- Introducción al almacén de columnas para análisis operativos en tiempo real
- Descripción de los índices de almacén de columnas
columnstore
Una secuencia de entradas de blog excelentes explica de manera elegante los índices de almacén de columnas desde varias perspectivas. En la mayoría de las publicaciones se describe más el concepto de análisis operacional en tiempo real, que es compatible con el almacén de columnas. Sunil Agarwal, director de programas en Microsoft, creó estas entradas en marzo de 2016.
análisis operativo en tiempo real
- Análisis operativos en tiempo real mediante la tecnología In-Memory
- Análisis operativos en tiempo real: información general del índice de almacén de columnas no agrupado (NCCI)
- Análisis operativos en tiempo real: ejemplo sencillo usando un índice de almacén de columnas no agrupado (NCCI) en SQL Server 2016
- Análisis operativos en tiempo real: las operaciones DML y el índice de almacén de columnas no agrupado (NCCI) en SQL Server 2016
- Análisis operativos en tiempo real: índice de almacén de columnas no agrupado filtrado (NCCI)
- Análisis operativos en tiempo real: opción de retraso de compresión del índice de almacén de columnas no agrupado (NCCI)
- Análisis operativos en tiempo real: opción de retraso de compresión con NCCI y el rendimiento
- Análisis operativos en tiempo real: tablas con optimización para memoria e índice de almacén de columnas
Desfragmentar un índice de almacén de columnas.
- Desfragmentación del índice de almacén de columnas mediante el comando REORGANIZE
- Directiva de combinación del índice de almacén de columnas para REORGANIZE
Importación masiva de datos
- Almacén de columnas agrupadas: carga masiva
- Índice de almacén de columnas agrupado: optimizaciones de carga de datos: registro mínimo
- Índice de almacén de columnas agrupado: optimizaciones de carga de datos: importación masiva en paralelo
Característica de OLTP en memoria
Veamos las características principales de OLTP en memoria.
Tablas optimizadas para memoria
La palabra clave MEMORY_OPTIMIZED de T-SQL, en la instrucción CREATE TABLE, indica que se crea una tabla en la memoria activa, en lugar de en disco.
Las tablas con optimización para memoria tienen una representación de sí mismas en la memoria activa y una copia secundaria en el disco.
- La copia del disco es para recuperación rutinaria después de un cierre y reinicio del servidor o de la base de datos. Esta dualidad de disco más memoria está oculta automáticamente y no se ve en el código.
Módulos compilados de forma nativa
La palabra clave NATIVE_COMPILATION de T-SQL, en la instrucción CREATE PROCEDURE, indica que se crea un procedimiento almacenado compilado de forma nativa. Las instrucciones de T-SQL se compilan en el código máquina la primera vez que se usa el procedimiento nativo cada vez que la base de datos se recorre en línea. Las instrucciones de T-SQL ya no aguantan la interpretación lenta de cada instrucción.
- Hemos visto el resultado de compilación nativa en duraciones de 1/100 de la duración interpretada.
Un módulo nativo solamente puede hacer referencia a tablas optimizadas para memoria, y no a tablas basadas en disco.
Hay tres tipos de módulos compilados de forma nativa:
- Procedimientos almacenados compilados de forma nativa.
- Funciones definidas por el usuario (UDF) compiladas de forma nativa, que son escalares.
- Desencadenadores compilados de forma nativa.
Disponibilidad en Base de datos SQL de Azure
OLTP en memoria y Almacén de columnas están disponibles en Azure SQL Database. Para detalles, consulte Optimize Performance using In-Memory Technologies in SQL Database (Optimizar el rendimiento con las tecnologías In-Memory en SQL Database).
1. Garantizar un nivel de compatibilidad >= 130
Esta sección es la primera de una serie de secciones numeradas que muestran la sintaxis de Transact-SQL que puede usar para implementar características de OLTP en memoria.
En primer lugar, es importante que la base de datos se establezca en un nivel de compatibilidad de al menos 130. A continuación figura el código de T-SQL para ver el nivel de compatibilidad actual en el que está establecida la base de datos actual.
SELECT d.compatibility_level
FROM sys.databases as d
WHERE d.name = Db_Name();
A continuación figura el código de T-SQL para actualizar el nivel, si es necesario.
ALTER DATABASE CURRENT
SET COMPATIBILITY_LEVEL = 130;
2. Elevar a SNAPSHOT
Cuando una transacción implica una tabla basada en disco y una tabla optimizada para memoria, la llamamos transacción entre contenedores. En una transacción de este tipo es esencial que la parte optimizada para memoria de la transacción funcione en el nivel de aislamiento de la transacción llamado SNAPSHOT.
Para exigir de forma confiable este nivel para tablas optimizadas para memoria en una transacción entre contenedores, modifique la configuración de la base de datos ejecutando el siguiente código T-SQL.
ALTER DATABASE CURRENT
SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT = ON;
3. Crear un grupo de archivos optimizado
En Microsoft SQL Server, antes de poder crear una tabla optimizada para memoria debe crear un grupo de archivos que declara CONTAINS MEMORY_OPTIMIZED_DATA. El grupo de archivos se asigna a la base de datos. Para obtener más información, consulte:
En Azure SQL Database, no es necesario y no se puede crear tal grupo de archivos.
El siguiente ejemplo de script T-SQL habilita una base de datos para OLTP en memoria y configura todos los ajustes recomendados. Funciona con SQL Server y Azure SQL Database: enable-in-memory-oltp.sql.
Tenga en cuenta que no todas las características de SQL Server son compatibles con las bases de datos que tienen un grupo de archivos MEMORY_OPTIMIZED_DATA. Para más información sobre las limitaciones, vea Características de SQL Server no admitidas para OLTP en memoria.
4. Crear una tabla optimizada para memoria
La palabra clave de Transact-SQL fundamental es la palabra clave MEMORY_OPTIMIZED.
CREATE TABLE dbo.SalesOrder
(
SalesOrderId integer not null IDENTITY
PRIMARY KEY NONCLUSTERED,
CustomerId integer not null,
OrderDate datetime not null
)
WITH
(MEMORY_OPTIMIZED = ON,
DURABILITY = SCHEMA_AND_DATA);
Las instrucciones INSERT y SELECT de Transact-SQL en una tabla optimizada para memoria son las mismos que para una tabla normal.
ALTER TABLE para tablas con optimización para memoria
ALTER TABLE... ADD/DROP puede agregar o quitar una columna de una tabla optimizada para memoria o un índice.
- CREATE INDEX y DROP INDEX no se pueden ejecutar en una tabla optimizada para memoria, use ALTER TABLE ... ADD/DROP INDEX en su lugar.
- Para obtener detalles, vea Modificar tablas con optimización para memoria.
Planear sus índices y tablas optimizadas para memoria
- Índices de tablas con optimización para memoria
- Construcciones de Transact-SQL no admitidas en In-Memory OLTP.
5. Crear un procedimiento almacenado compilado de forma nativa (procedimiento nativo)
La palabra clave fundamental es NATIVE_COMPILATION.
CREATE PROCEDURE ncspRetrieveLatestSalesOrderIdForCustomerId
@_CustomerId INT
WITH
NATIVE_COMPILATION,
SCHEMABINDING
AS
BEGIN ATOMIC
WITH
(TRANSACTION ISOLATION LEVEL = SNAPSHOT,
LANGUAGE = N'us_english')
DECLARE @SalesOrderId int, @OrderDate datetime;
SELECT TOP 1
@SalesOrderId = s.SalesOrderId,
@OrderDate = s.OrderDate
FROM dbo.SalesOrder AS s
WHERE s.CustomerId = @_CustomerId
ORDER BY s.OrderDate DESC;
RETURN @SalesOrderId;
END;
La palabra clave SCHEMABINDING significa que las tablas a las que se hace referencia en el procedimiento nativo no se puede quitar a menos que dicho procedimiento se quite primero. Para obtener detalles, vea Crear procedimientos almacenados compilados de forma nativa.
Tenga en cuenta que no es necesario crear un procedimiento almacenado compilado de forma nativa para tener acceso a una tabla optimizada en memoria. También puede hacer referencia a tablas optimizadas en memoria desde procedimientos almacenados tradicionales y desde lotes ad hoc.
6. Ejecutar el procedimiento nativo
Rellene la tabla con dos filas de datos.
INSERT into dbo.SalesOrder
( CustomerId, OrderDate )
VALUES
( 42, '2013-01-13 03:35:59' ),
( 42, '2015-01-15 15:35:59' );
Después seguirá una llamada EXECUTE al procedimiento almacenado compilado de forma nativa.
DECLARE @LatestSalesOrderId int, @mesg nvarchar(128);
EXECUTE @LatestSalesOrderId =
ncspRetrieveLatestSalesOrderIdForCustomerId 42;
SET @mesg = CONCAT(@LatestSalesOrderId,
' = Latest SalesOrderId, for CustomerId = ', 42);
PRINT @mesg;
Esta es la salida de PRINT real:
-- 2 = Latest SalesOrderId, for CustomerId = 42
Guía de la documentación y pasos siguientes
Los ejemplos anteriores sin formato constituyen una base para aprender las características más avanzadas de OLTP en memoria. Las secciones siguientes constituyen una guía a las consideraciones especiales que convendría conocer y dónde puede encontrar los detalles sobre cada una de ellas.
¿Cómo funcionan las características de OLTP en memoria tan rápido?
Las siguientes subsecciones describen brevemente cómo funcionan las características de OLTP en memoria internamente para proporcionar un rendimiento mejorado.
¿Cómo funcionan las tablas optimizadas para memoria más rápido?
Doble naturaleza: Una tabla optimizada para memoria tiene una doble naturaleza: una representación en memoria activa y la otra en el disco duro. Cada transacción se confirma con ambas representaciones de la tabla. Las transacciones funcionan en la representación memoria activa mucho más rápida. Las tablas con optimización para memoria se benefician de la mayor velocidad de la memoria activa en comparación con el disco. Además, la mayor agilidad de la memoria activa hace práctica una estructura de tabla más avanzada que se optimiza para velocidad. La estructura avanzada tampoco tiene páginas, por lo que evita la sobrecarga y la contención de bloqueos temporales y bloqueos por subproceso.
No hay bloqueos: La tabla optimizada para memoria se basa en un enfoque optimista de los objetivos de la competencia de integridad de datos frente a la simultaneidad y el alto rendimiento. Durante la transacción, la tabla no coloca bloqueos en ninguna versión de las filas de datos actualizadas. Esto puede reducir considerablemente la contención en algunos sistemas de gran volumen.
Versiones de fila: En lugar de bloqueos, la tabla optimizada para memoria agrega una nueva versión de una fila actualizada en la propia tabla, no en tempdb. La fila original se mantiene hasta que se confirma la transacción. Durante la transacción, otros procesos pueden leer la versión original de la fila.
- Cuando se crean varias versiones de una fila para una tabla basada en disco, las versiones de fila se almacenan temporalmente en tempdb.
Menos tareas de registro: Las versiones anterior y posterior de las filas actualizadas se mantienen en la tabla optimizada para memoria. El par de filas proporciona gran parte de la información que tradicionalmente se escribe en el archivo de registro. Esto permite al sistema escribir menos información y con menos frecuencia en el registro. Aún así, la integridad transaccional está garantizada.
¿Cómo funcionan los procedimientos nativos más rápido?
Convertir un procedimiento almacenado interpretado normal en un procedimiento almacenado compilado de forma nativa, reduce considerablemente el número de instrucciones que se ejecutan en tiempo de ejecución.
Ventajas e inconvenientes de las características en memoria
Como es habitual en informática, las mejoras de rendimiento que ofrecen las características en memoria son una solución de compromiso. Las mejores características ofrecen beneficios que son más valiosos que los costos adicionales de la característica. Puede encontrar instrucciones completas sobre los compromisos en:
En el resto de esta sección se enumeran algunas de las consideraciones principales de planeación y compromiso.
Ventajas e inconvenientes de las tablas optimizadas para memoria
Calcular la memoria: Debe calcular la cantidad de memoria activa que consumirá la tabla optimizada para memoria. El equipo debe tener la capacidad de memoria suficiente para hospedar una tabla optimizada para memoria. Para obtener más información, consulte:
- Supervisar y solucionar problemas de uso de memoria
- Estimar los requisitos de memoria para las tablas con optimización para memoria
- Tamaño de tabla y fila de las tablas con optimización para memoria
Dividir la tabla grande: Una manera de satisfacer la demanda de grandes cantidades de memoria activa es dividir la tabla grande en partes en memoria que almacenen filas de datos recientes calientes frente a otras partes en el disco que almacenen filas heredadas frías (por ejemplo, pedidos de ventas que se han enviado y completado totalmente). Esta división es un proceso manual de diseño e implementación. Vea:
- Creación de particiones en el nivel de aplicación
- Patrón de aplicación para crear particiones de tablas con optimización para memoria
Ventajas e inconvenientes de los procedimientos nativos
- Un procedimiento almacenado compilado de forma nativa no puede acceder a una tabla basada en disco. Un procedimiento nativo solo puede acceder a tablas optimizadas en memoria.
- Cuando se ejecuta un procedimiento nativo por primera vez después de que el servidor o base de datos vuelve a estar en línea, el procedimiento nativo se debe compilar de nuevo una vez. Esto provoca un retraso antes de que el procedimiento nativo empieza a ejecutarse.
Consideraciones avanzadas sobre tablas optimizadas para memoria
Losíndices de tablas con optimización para memoria difieren en algunos aspectos de los índices de las tablas en disco tradicionales. Los índices de hash solo están disponibles en las tablas optimizadas para memoria.
- Índices de hash para tablas optimizadas para memoria
- Índice no agrupado de tablas optimizadas para memoria
Debe tener un plan para asegurarse de que haya suficiente memoria activa para la tabla optimizada para memoria planeada y sus índices. Vea:
Es posible declarar una tabla optimizada para memoria con DURABILITY = SCHEMA_ONLY:
- Esta sintaxis indica al sistema que descarte todos los datos de la tabla optimizada para memoria cuando la base de datos se desconecta. Solo se conserva la definición de tabla.
- Cuando la base de datos vuelva a estar en línea, la tabla optimizada para memoria se vuelve a cargar en la memoria activa, vacía de datos.
- Las tablas SCHEMA_ONLY pueden ser una mejor alternativa a las tablas temporales en tempdb, cuando hay implicados varios miles de filas.
Las variables de tabla también pueden declararse como optimizadas para memoria. Vea:
Consideraciones avanzadas para módulos compilados de forma nativa
Los tipos de módulos compilados de forma nativa disponibles a través de Transact-SQL son:
- Procedimientos almacenados compilados de forma nativa (procedimientos nativos).
- Funciones escalares definidas por el usuariocompiladas de forma nativa.
- Desencadenadores compilados de forma nativa (desencadenadores nativos).
- Solo los desencadenadores compilados de forma nativa se permiten en tablas optimizadas para memoria.
- Funciones con valores de tablacompiladas de forma nativa.
Una función definida por el usuario (UDF) compilada de forma nativa se ejecuta más rápido que una UDF interpretada. Debe tener en cuenta lo siguiente con respecto a las UDF:
- Cuando una instrucción SELECT de T-SQL usa una UDF, siempre se llama una vez a la UDF por cada fila devuelta.
- Las UDF nunca se ejecutan en línea, sino que siempre se llaman.
- La distinción compilada es menos significativa de lo que es la sobrecarga de llamadas repetidas que es inherente a todas las UDF.
- A pesar de ello, la sobrecarga de llamadas a UDF suele ser aceptable en la práctica.
Para obtener datos de prueba y una explicación del rendimiento de UDF nativas, vea:
Guía de documentación para tablas optimizadas para memoria
Consulte estos otros artículos que tratan consideraciones especiales para tablas optimizadas para memoria:
- Migrar a OLTP en memoria
- Determinar si una tabla o un procedimiento almacenado se debe pasar a OLTP en memoria
- El informe de análisis rendimiento de transacciones de SQL Server Management Studio ayuda a evaluar si OLTP en memoria mejorará el rendimiento de la aplicación de base de datos.
- Utilice el Asesor de optimización de memoria que le ayudarán a migrar la tabla de base de datos basada en disco a OLTP en memoria.
- Hacer copia de seguridad, restaurar y recuperar tablas con optimización para memoria
- El almacenamiento usado por las tablas optimizadas para memoria puede ser mucho mayor que el tamaño de la memoria y eso afecta al tamaño de la copia de seguridad de la base de datos.
- Transacciones con tablas con optimización para memoria
- Incluye información sobre la lógica de reintento en T-SQL para las transacciones en tablas optimizadas para memoria.
- Compatibilidad de Transact-SQL con OLTP en memoria
- Los tipos de datos y T-SQL admitidos y no admitidos, para tablas optimizadas para memoria y procedimientos nativos.
- Enlazar una base de datos con tablas con optimización para memoria a un grupo de recursos de servidor, que analiza una consideración avanzada opcional.
Guía de documentación para procedimientos nativos
El siguiente artículo, y los artículos secundarios en la tabla de contenido (TOC), explican los detalles sobre los procedimientos almacenados compilados de forma nativa.
Vínculos relacionados
- Artículo inicial: OLTP en memoria (optimización en memoria)
Los artículos siguientes incluyen código para demostrar las mejoras de rendimiento que se pueden lograr con el uso de OLTP en memoria:
- Demostración: mejora de rendimiento de OLTP en memoria ofrece una demostración a pequeña escala de las posibles mejoras de rendimiento más grandes.
- Sample Database for In-Memory OLTP (Base de datos de ejemplo para OLTP en memoria) ofrece una demostración de escala mayor.