Demo: Leistungsverbesserungen von In-Memory OLTP

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed Instance

Das Codebeispiel in diesem Thema veranschaulicht die hohe Leistung von speicheroptimierten Tabellen. Die Leistungsverbesserung ist offensichtlich, wenn auf Daten in einer speicheroptimierten Tabelle aus herkömmlichen, interpretierten Transact-SQL zugegriffen wird. Diese Leistungsverbesserung wird noch größer, wenn von einer nativ kompilierten gespeicherten Prozedur (NCSProc) aus auf Daten in einer speicheroptimierten Tabelle zugegriffen werden.

Eine umfassendere Darstellung der potenziellen Leistungssteigerungen von In-Memory OLTP finden Sie unter In-Memory OLTP Performance Demo v1.0.

Das Codebeispiel im vorliegenden Artikel ist singlethreaded, und es nutzt nicht die Parallelitätsvorteile von In-Memory OLTP. Eine Arbeitsauslastung, die Parallelität verwendet, bietet noch größere Leistungsvorteile. Das Codebeispiel zeigt nur einen Aspekt der Leistungssteigerung, und zwar die Datenzugriffseffizienz für INSERT.

Die durch speicheroptimierte Tabellen erzielte Leistungsverbesserung wird voll genutzt, wenn auf die Daten in einer speicheroptimierten Tabelle mithilfe einer NCSProc zugegriffen wird.

Codebeispiel

Diese jeweiligen Schritte werden in den nächsten Unterabschnitten beschrieben.

Schritt 1a: Voraussetzung bei Verwendung von SQL Server

Die Schritte in diesem ersten Unterabschnitt gelten nur, wenn Sie in SQL Server ausgeführt werden, und gelten nicht, wenn Sie in der Azure SQL-Datenbank ausgeführt werden. Führen Sie folgende Schritte aus:

  1. Verwenden Sie SQL Server Management Studio (SSMS.exe), um eine Verbindung mit Ihrem SQL Server herzustellen. Alternativ können Sie jedes Tool nehmen, das wie „SSMS.exe“ funktioniert.

  2. Erstellen Sie manuell ein Verzeichnis mit dem Namen "C:\data\". In dem Transact-SQL-Beispielcode wird davon ausgegangen, dass das Verzeichnis bereits vorhanden ist.

  3. Führen Sie das kurze T-SQL aus, um die Datenbank und die speicheroptimierte Dateigruppe zu erstellen.

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  

Schritt 1b: Voraussetzung bei Verwendung der Azure SQL-Datenbank

Dieser Unterabschnitt gilt nur, wenn Sie Azure SQL-Datenbank verwenden. Führen Sie folgende Schritte aus:

  1. Entscheiden Sie, welche vorhandene Testdatenbank Sie für das Codebeispiel verwenden werden.

  2. Wenn Sie eine neue Testdatenbank erstellen möchten, verwenden Sie das Azure-Portal , und erstellen Sie eine Datenbank namens imoltp.

Wenn Sie Anleitungen zur Erstellung einer Testdatenbank mit dem Azure-Portal suchen, lesen Sie Erste Schritte mit Azure SQL-Datenbank.

Schritt 2: Erstellen von speicheroptimierten Tabellen und NCSProc

In diesem Schritt wird die Erstellung einer speicheroptimierten Tabelle und einer nativ kompilierten gespeicherten Prozedur (NCSProc) erläutert. Führen Sie folgende Schritte aus:

  1. Verwenden Sie „SSMS.exe“, um sich mit der neuen Datenbank zu verbinden.

  2. Führen Sie die folgende T-SQL-Anweisung in der Datenbank aus.

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  

Schritt 3: Ausführen des Codes

Sie können nun die Abfragen ausführen, die die Leistung von speicheroptimierten Tabellen veranschaulichen. Führen Sie folgende Schritte aus:

  1. Verwenden Sie „SSMS.exe“, um die folgende T-SQL-Anweisung in der Datenbank auszuführen,

    Ignorieren Sie die Geschwindigkeits- oder andere Leistungsdaten, die bei dieser ersten Ausführung generiert werden. Die erste Ausführung stellt sicher, dass mehrere einmalige Vorgänge ausgeführt werden, z.B. die anfängliche Zuordnung von Arbeitsspeicher.

  2. Verwenden Sie „SSMS.exe“ erneut, um die folgende T-SQL-Anweisung erneut in der Datenbank auszuführen,

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  

Als Nächstes kommen die Ausgabezeitstatistiken, die bei unserer zweiten Testausführung generiert werden.

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.  

Weitere Informationen

In-Memory OLTP (In-Memory Optimization)