Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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 la práctica, algunos blogueros se refieren a OLTP en memoria como Hekaton.
Ventajas de las funcionalidades 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:
-
El análisis operativo por lotes se refiere a procesos de agregación que se ejecutan fuera del horario laboral o en hardware secundario que contiene 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:
- Primeros pasos con Columnstore para análisis operativos en tiempo real
- Guía de índices de almacén de columnas
almacén de columnas
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 operativo 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 columnstore
- 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 T-SQL MEMORY_OPTIMIZED, en la CREATE TABLE instrucción , es cómo se crea una tabla para existir en la memoria activa, en lugar de en el 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 entre memoria y disco está completamente oculta para ti y para tu código.
Módulos compilados de forma nativa
La palabra clave T-SQL NATIVE_COMPILATION, en la instrucción CREATE PROCEDURE, es la forma de crear 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. Elevación 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 de la transacción optimizada para memoria funcione en el nivel de aislamiento denominado 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);
INSERTTransact-SQL y las instrucciones SELECT en una tabla optimizada para memoria son las mismas que para una tabla normal.
ALTER TABLE para tablas optimizadas 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.
Planifique sus tablas optimizadas para memoria e índices
- Índices para tablas optimizadas 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 hace referencia el procedimiento nativo no se pueden eliminar a menos que primero se elimine el procedimiento nativo. 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 sencillos ejemplos anteriores sientan las bases 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 las características de In-Memory OLTP funcionan mucho más 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 ofrecen un mayor rendimiento las tablas optimizadas para memoria
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 se ejecutan sobre la representación en 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 rapidez de la memoria activa hace viable una estructura de tablas más avanzada, optimizada para la 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 se ejecutan más rápido los procedimientos nativos
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 proporcionan las funcionalidades In-Memory implican una contrapartida. 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 principales consideraciones de planificación y compensaciones.
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 sistema debe tener suficiente capacidad de memoria para alojar 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 planificar para garantizar que habrá suficiente memoria activa para la tabla optimizada para memoria que tiene previsto crear y para 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 invocan.
- 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.
- Vincular una base de datos con tablas optimizadas para memoria a un grupo de recursos, donde se aborda una consideración avanzada opcional.
Guía de documentación para procedimientos nativos
En el siguiente artículo, y en los artículos secundarios en la tabla de contenido (TOC), se 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.