Delen via


Demonstratie: Prestatieverbetering van In-Memory OLTP

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

In het codevoorbeeld in dit onderwerp ziet u de snelle prestaties van tabellen die zijn geoptimaliseerd voor geheugen. De prestatieverbetering is duidelijk wanneer gegevens in een tabel die is geoptimaliseerd voor geheugen toegankelijk zijn vanuit traditionele, geïnterpreteerde Transact-SQL. Deze prestatieverbetering is nog groter wanneer gegevens in een tabel die is geoptimaliseerd voor geheugen toegankelijk zijn vanuit een systeemeigen gecompileerde opgeslagen procedure (NCSProc).

Zie In-Memory OLTP Performance Demo v1.0 voor een uitgebreidere demonstratie van de mogelijke prestatieverbeteringen van In-Memory OLTP.

Het codevoorbeeld in dit artikel is enkelvoudig en profiteert niet van de gelijktijdigheidsvoordelen van In-Memory OLTP. Een workload die gebruikmaakt van gelijktijdigheid, ziet een grotere prestatiewinst. In het codevoorbeeld ziet u slechts één aspect van prestatieverbetering, namelijk efficiëntie van gegevenstoegang voor INSERT.

De prestatieverbetering die wordt geboden door tabellen die zijn geoptimaliseerd voor geheugen, wordt volledig gerealiseerd wanneer gegevens in een tabel die is geoptimaliseerd voor geheugen toegankelijk zijn vanuit een NCSProc.

Codevoorbeeld

In de volgende subsecties wordt elke stap beschreven.

Stap 1a: Vereisten wanneer u SQL Server gebruikt

De stappen in deze eerste subsectie zijn alleen van toepassing als u in SQL Server werkt en niet van toepassing als u in Azure SQL Database werkt. Ga als volgt te werk:

  1. Gebruik SQL Server Management Studio (SSMS.exe) om verbinding te maken met uw SQL Server. Of elk hulpprogramma dat vergelijkbaar is met SSMS.exe is prima.

  2. Maak handmatig een map met de naam C:\data\. De voorbeeldcode Transact-SQL verwacht dat de map al bestaat.

  3. Voer de korte T-SQL uit om de database en de voor het geheugen geoptimaliseerde bestandsgroep te maken.

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  

Stap 1b: vereisten als u Azure SQL Database gebruikt

Deze subsectie is alleen van toepassing als u Azure SQL Database gebruikt. Ga als volgt te werk:

  1. Bepaal welke bestaande testdatabase u gaat gebruiken voor het codevoorbeeld.

  2. Als u besluit een nieuwe testdatabase te maken, gebruikt u Azure Portal om een database met de naam imoltp te maken.

Zie Aan de slag met Azure SQL Database als u instructies wilt voor het gebruik van Azure Portal.

Stap 2: Geheugen-geoptimaliseerde tabellen en NCSProc maken

Met deze stap maakt u tabellen die zijn geoptimaliseerd voor geheugen en een systeemeigen gecompileerde opgeslagen procedure (NCSProc). Ga als volgt te werk:

  1. Gebruik SSMS.exe om verbinding te maken met uw nieuwe database.

  2. Voer de volgende T-SQL uit in uw database.

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  

Stap 3: De code uitvoeren

U kunt nu de query's uitvoeren waarmee de prestaties van tabellen die zijn geoptimaliseerd voor geheugen worden gedemonstreerd. Ga als volgt te werk:

  1. Gebruik SSMS.exe om de volgende T-SQL uit te voeren in uw database.

    Negeer eventuele snelheids- of andere prestatiegegevens die door deze eerste uitvoering worden gegenereerd. De eerste uitvoering zorgt ervoor dat er meerdere eenmalige bewerkingen worden uitgevoerd, zoals initiële toewijzingen van geheugen.

  2. Gebruik opnieuw SSMS.exe om de volgende T-SQL opnieuw uit te voeren in uw database.

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  

Hierna volgen de uitvoertijdstatistieken die worden gegenereerd door onze tweede testuitvoering.

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.  

Zie ook

In-Memory OLTP (In-Memory Optimalisatie)