Ukázka: Zlepšení výkonu In-Memory OLTP

platí pro: SQL Server Azure SQL DatabaseAzure SQL Managed Instance

Ukázka kódu v tomto tématu ukazuje rychlý výkon tabulek optimalizovaných pro paměť. Zlepšení výkonu je zřejmé, když se k datům v tabulce optimalizované pro paměť přistupuje z tradičního interpretovaného jazyka Transact-SQL. Toto zlepšení výkonu je ještě větší, když se k datům v tabulce optimalizované pro paměť přistupuje z nativně zkompilované uložené procedury (NCSProc).

Podrobnější ukázku potenciálních vylepšení výkonu In-Memory OLTP najdete v In-Memory OLTP Ukázka výkonu v1.0.

Příklad kódu v tomto článku je jednovláknový a nevyužívá výhody souběžnosti In-Memory OLTP. Úloha, která používá souběžnost, uvidí vyšší zvýšení výkonu. Příklad kódu ukazuje pouze jeden aspekt zlepšení výkonu, konkrétně efektivitu přístupu k datům pro INSERT.

Zlepšení výkonu nabízené tabulkami optimalizovanými pro paměť je plně realizováno, když se k datům v tabulce optimalizované pro paměť přistupuje z NCSProc.

Příklad kódu

Jednotlivé kroky popisují následující pododdíly.

Krok 1a: Předpoklad, pokud používáte SQL Server

Kroky v této první pododdíle platí jenom v případě, že používáte SQL Server a neplatí, pokud používáte Azure SQL Database. Postupujte následovně:

  1. K připojení k SQL Serveru použijte SQL Server Management Studio (SSMS.exe). Nebo jakýkoli nástroj podobný SSMS.exe je v pořádku.

  2. Ručně vytvořte adresář S názvem C:\data\. Ukázkový Transact-SQL kód očekává, že adresář už existuje.

  3. Spuštěním krátkého T-SQL vytvořte databázi a její skupinu souborů optimalizovanou pro paměť.

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  

Krok 1b: Předpoklad, pokud používáte Azure SQL Database

Tato pododdíl platí jenom v případě, že používáte Azure SQL Database. Postupujte následovně:

  1. Rozhodněte se, kterou existující testovací databázi použijete pro příklad kódu.

  2. Pokud se rozhodnete vytvořit novou testovací databázi, vytvořte pomocí webu Azure Portal databázi s názvem imoltp.

Pokud chcete pokyny k použití webu Azure Portal pro tento postup, přečtěte si téma Začínáme se službou Azure SQL Database.

Krok 2: Vytvoření tabulek Memory-Optimized a NCSProc

Tento krok vytvoří tabulky optimalizované pro paměť a nativně zkompilovanou uloženou proceduru (NCSProc). Postupujte následovně:

  1. Pomocí SSMS.exe se připojte k nové databázi.

  2. V databázi spusťte následující příkaz T-SQL.

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  

Krok 3: Spuštění kódu

Teď můžete spouštět dotazy, které demonstrují výkon tabulek optimalizovaných pro paměť. Postupujte následovně:

  1. Pomocí SSMS.exe spusťte v databázi následující jazyk T-SQL.

    Ignorujte veškerá rychlost nebo jiná data o výkonu, která tato první spuštění vygeneruje. První spuštění zajistí provedení několika jednorázových operací, jako jsou počáteční přidělení paměti.

  2. Znovu použijte SSMS.exe k opětovnému spuštění následujícího T-SQL ve vaší databázi.

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  

Dále jsou statistiky výstupního času vygenerované naším druhým testovacím spuštěním.

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.  

Viz také

In-Memory OLTP (optimalizaceIn-Memory)