Demostración: mejora de rendimiento de OLTP en memoria

Se aplica a: SQL Server Azure SQL Database Azure SQL Managed Instance

En el ejemplo de código de este tema se muestra el rápido funcionamiento de las tablas optimizadas para memoria. La mejora del rendimiento es evidente cuando el acceso a los datos de una tabla optimizada para memoria se realiza desde Transact-SQL tradicional interpretado. Esta mejora del rendimiento es incluso mayor cuando el acceso a los datos de una tabla optimizada para memoria se realiza a través de un procedimiento almacenado compilado de forma nativa (NCSProc).

Para una demostración más completa de las posibles mejoras de rendimiento de OLTP en memoria, consulte In-Memory OLTP Performance Demo v1.0(Demostración de rendimiento de OLTP en memoria v1.0).

El ejemplo de código del presente artículo es de un solo subproceso y no aprovecha las ventajas de simultaneidad de OLTP en memoria. Una carga de trabajo que utiliza simultaneidad verá mayor mejora de rendimiento. El ejemplo de código muestra solo un aspecto de mejora del rendimiento, la eficacia de acceso a datos para la operación INSERT.

La mejora del rendimiento que ofrecen las tablas optimizadas para memoria se percibe totalmente cuando el acceso a los datos de una tabla optimizada para memoria se realiza a través de un NCSProc.

Ejemplo de código

En las siguientes subsecciones se describe cada paso.

Paso 1a: requisito previo si se usa SQL Server

Los pasos de la primera subsección solo se aplican si se está ejecutando en SQL Server, pero no si se está ejecutando en Azure SQL Database. Haga lo siguiente:

  1. Use SQL Server Management Studio (SSMS.exe) para conectarse a SQL Server. Cualquier herramienta similar a SSMS.exe también está bien.

  2. Cree manualmente un directorio denominado C:\data\. El código de ejemplo de Transact-SQL espera que el directorio ya exista.

  3. Ejecute el T-SQL corto para crear la base de datos y su grupo de archivos optimizados para memoria.

go  
CREATE DATABASE imoltp;    --  Transact-SQL  
go  
  
ALTER DATABASE imoltp ADD FILEGROUP [imoltp_mod]  
    CONTAINS MEMORY_OPTIMIZED_DATA;  
  
ALTER DATABASE imoltp ADD FILE  
    (name = [imoltp_dir], filename= 'c:\data\imoltp_dir')  
    TO FILEGROUP imoltp_mod;  
go  
  
USE imoltp;  
go  

Paso 1b: Requisito previo si se usa Azure SQL Database

Esta subsección solo se aplica si usa Azure SQL Database. Haga lo siguiente:

  1. Decida qué base de datos de prueba existente usará para el ejemplo de código.

  2. Si decide crear una nueva base de datos de prueba, use el portal de Azure para crear una base de datos denominada imoltp.

Si desea obtener instrucciones para usar el portal de Azure para esto, consulte Get Started with Azure SQL Database (Introducción a Base de datos SQL de Azure).

Paso 2: crear tablas con optimización para memoria y un NCSProc.

En este paso se crean tablas optimizadas para memoria y un procedimiento almacenado compilado de forma nativa (NCSProc). Haga lo siguiente:

  1. Use SSMS.exe para conectarse a la nueva base de datos.

  2. Ejecute el siguiente T-SQL en la base de datos.

go  
DROP PROCEDURE IF EXISTS ncsp;  
DROP TABLE IF EXISTS sql;  
DROP TABLE IF EXISTS hash_i;  
DROP TABLE IF EXISTS hash_c;  
go  
  
CREATE TABLE [dbo].[sql] (  
  c1 INT NOT NULL PRIMARY KEY,  
  c2 NCHAR(48) NOT NULL  
);  
go  
  
CREATE TABLE [dbo].[hash_i] (  
  c1 INT NOT NULL PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT=1000000),  
  c2 NCHAR(48) NOT NULL  
) WITH (MEMORY_OPTIMIZED=ON, DURABILITY = SCHEMA_AND_DATA);  
go  
  
CREATE TABLE [dbo].[hash_c] (  
  c1 INT NOT NULL PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT=1000000),  
  c2 NCHAR(48) NOT NULL  
) WITH (MEMORY_OPTIMIZED=ON, DURABILITY = SCHEMA_AND_DATA);  
go  
  
CREATE PROCEDURE ncsp  
    @rowcount INT,  
    @c NCHAR(48)  
  WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER  
  AS   
  BEGIN ATOMIC   
  WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english')  
  DECLARE @i INT = 1;  
  WHILE @i <= @rowcount  
  BEGIN;  
    INSERT INTO [dbo].[hash_c] VALUES (@i, @c);  
    SET @i += 1;  
  END;  
END;  
go  

Paso 3: ejecutar el código

Ahora se pueden ejecutar las consultas que mostrarán el rendimiento de las tablas optimizadas para memoria. Haga lo siguiente:

  1. Use SSMS.exe para ejecutar el siguiente T-SQL en la base de datos.

    No haga caso de los datos de velocidad u otros datos de rendimiento que se generen durante esta primera ejecución. La primera ejecución garantiza la realización de varias operaciones que se efectúan una sola vez, como las asignaciones iniciales de memoria.

  2. Vuelva a usar SSMS.exe para ejecutar el siguiente T-SQL en la base de datos.

go  
SET STATISTICS TIME OFF;  
SET NOCOUNT ON;  
  
-- Inserts, one at a time.  
  
DECLARE @starttime DATETIME2 = sysdatetime();  
DECLARE @timems INT;  
DECLARE @i INT = 1;  
DECLARE @rowcount INT = 100000;  
DECLARE @c NCHAR(48) = N'12345678901234567890123456789012345678';  
  
-- Harddrive-based table and interpreted Transact-SQL.  
  
BEGIN TRAN;  
  WHILE @i <= @rowcount  
  BEGIN;  
    INSERT INTO [dbo].[sql] VALUES (@i, @c);  
    SET @i += 1;  
  END;  
COMMIT;  
  
SET @timems = datediff(ms, @starttime, sysdatetime());  
SELECT 'A: Disk-based table and interpreted Transact-SQL: '  
    + cast(@timems AS VARCHAR(10)) + ' ms';  
  
-- Interop Hash.  
  
SET @i = 1;  
SET @starttime = sysdatetime();  
  
BEGIN TRAN;  
  WHILE @i <= @rowcount  
    BEGIN;  
      INSERT INTO [dbo].[hash_i] VALUES (@i, @c);  
      SET @i += 1;  
    END;  
COMMIT;  
  
SET @timems = datediff(ms, @starttime, sysdatetime());  
SELECT 'B: memory-optimized table with hash index and interpreted Transact-SQL: '  
    + cast(@timems as VARCHAR(10)) + ' ms';  
  
-- Compiled Hash.  
  
SET @starttime = sysdatetime();  
  
EXECUTE ncsp @rowcount, @c;  
  
SET @timems = datediff(ms, @starttime, sysdatetime());  
SELECT 'C: memory-optimized table with hash index and native SP:'  
    + cast(@timems as varchar(10)) + ' ms';  
go  
  
DELETE sql;  
DELETE hash_i;  
DELETE hash_c;  
go  

A continuación se muestran las estadísticas de tiempo de salida generadas por la segunda ejecución de prueba.

10453 ms , A: Disk-based table and interpreted Transact-SQL.  
5626 ms , B: memory-optimized table with hash index and interpreted Transact-SQL.  
3937 ms , C: memory-optimized table with hash index and native SP.  

Consulte también

In-Memory OLTP (optimización In-Memory)