Demonstração: aprimoramento do desempenho do OLTP na memória

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure

O exemplo de código neste tópico mostra o desempenho rápido de tabelas com otimização de memória. A melhoria de desempenho é evidente quando os dados em uma tabela com otimização de memória são acessados do Transact-SQL tradicional e interpretado. Essa melhoria do desempenho é ainda maior quando os dados em uma tabela com otimização de memória são acessados de um NCSProc (procedimento armazenado compilado nativamente).

Para ver uma demonstração mais abrangente de possíveis aprimoramentos de desempenho do OLTP in-memory, consulte Demonstração do desempenho do OLTP in-memory v1.0.

O exemplo de código neste artigo é de threading simples e não usufrui dos benefícios de simultaneidade do OLTP in-memory. Uma carga de trabalho que usa a simultaneidade apresentará um maior ganho de desempenho. O exemplo de código mostra apenas um aspecto da melhoria de desempenho, ou seja, a eficiência do acesso a dados para INSERT.

A melhoria de desempenho oferecida por tabelas com otimização de memória é feita completamente quando os dados em uma tabela com otimização de memória são acessados de um NCSProc.

Exemplo de código

As subseções a seguir descrevem cada etapa.

Etapa 1a: pré-requisito se estiver usando o SQL Server

As etapas nesta primeira subseção só se aplicarão se você estiver executando no SQL Server, e não se aplicarão se você estiver executando no Banco de Dados SQL do Azure. Faça o seguinte:

  1. Use o SSMS.exe (SQL Server Management Studio) para se conectar ao SQL Server. Qualquer outra ferramenta semelhante a SSMS.exe é aceitável.

  2. Crie manualmente um diretório denominado C:\data. O código Transact-SQL de exemplo espera que o diretório já exista.

  3. Execute o T-SQL curto para criar o banco de dados e seu grupo de arquivos com otimização de memória.

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  

Etapa 1b: pré-requisito se estiver usando o Banco de Dados SQL do Azure

Esta subseção só se aplicará você estiver usando o Banco de Dados SQL do Azure. Faça o seguinte:

  1. Decida qual banco de dados de teste existente você usará para o exemplo de código.

  2. Se você optar por criar um novo banco de dados de teste, use o portal do Azure para criar um banco de dados denominado imoltp.

Se você quiser instruções sobre como usar o portal do Azure para isso, veja Introdução ao Banco de Dados SQL do Azure.

Etapa 2: criar tabelas com otimização de memória e NCSProc

Essa etapa cria tabelas com otimização de memória e um NCSProc (procedimento armazenado compilado nativamente). Faça o seguinte:

  1. Use SSMS.exe para conectar-se ao novo banco de dados.

  2. Execute o comando T-SQL a seguir no banco de dados.

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  

Etapa 3: executar o código

Agora você pode executar as consultas que demonstrarão o desempenho de tabelas com otimização de memória. Faça o seguinte:

  1. Use o SSMS.exe para executar o comando T-SQL a seguir no banco de dados.

    Ignore qualquer velocidade ou outros dados de desempenho gerados por essa primeira execução. A primeira execução assegura que várias operações exclusivamente avulsas sejam executadas, como alocações iniciais de memória.

  2. Novamente, use o SSMS.exe para executar novamente o comando T-SQL a seguir no banco de dados.

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 seguir estão as estatísticas de tempo de saída geradas por nossa segunda execução de teste.

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.  

Confira também

OLTP na memória (otimização na memória)