데모: 메모리 내 OLTP 성능 향상Demonstration: Performance Improvement of In-Memory OLTP

이 항목 적용 대상: 예SQL Server예Azure SQL 데이터베이스없습니다Azure SQL 데이터 웨어하우스 없습니다 병렬 데이터 웨어하우스THIS TOPIC APPLIES TO: yesSQL ServeryesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

이 항목의 코드 예제는 메모리 최적화 테이블의 빠른 성능 향상을 보여줍니다.The code sample in this topic demonstrates the fast performance of memory-optimized tables. 이러한 성능 향상은 메모리 최적화 테이블의 데이터가 기존의 해석된 Transact-SQLTransact-SQL에서 액세스될 때 두드러집니다.The performance improvement is evident when data in a memory-optimized table is accessed from traditional, interpreted Transact-SQLTransact-SQL. 이러한 성능 향상은 메모리 최적화 테이블의 데이터가 고유하게 컴파일된 저장 프로시저(NCSProc)에서 액세스될 때 더욱 커집니다.This performance improvement is even greater when data in a memory-optimized table is accessed from a natively compiled stored procedure (NCSProc).

메모리 내 OLTP의 잠재적인 성능 향상에 대한 보다 포괄적인 데모를 보려면 메모리 내 OLTP 성능 데모 v1.0을 참조하세요.To see a more comprehensive demonstration of the potential performance improvements of In-Memory OLTP see In-Memory OLTP Performance Demo v1.0.

이 문서의 코드 예제는 단일 스레드이며 메모리 내 OLTP의 동시성 이점을 활용하지 않습니다.The code example in the present article is single-threaded, and it does not take advantage of the concurrency benefits of In-Memory OLTP. 동시성을 사용하는 작업에서는 더 큰 성능 향상이 가능합니다.A workload that uses concurrency will see a greater performance gain. 코드 예제는 성능 향상의 한 가지 측면인 삽입을 위한 데이터 액세스 효율성만 보여 줍니다.The code example shows only one aspect of performance improvement, namely data access efficiency for INSERT.

메모리 최적화 테이블로 제공되는 성능 향상은 메모리 최적화 테이블의 데이터가 NCSProc에서 액세스될 때 완벽하게 실현됩니다.The performance improvement offered by memory-optimized tables is fully realized when data in a memory-optimized table is accessed from a NCSProc.

코드 예Code Example

다음 하위 섹션에서는 각 단계에 대해 설명합니다.The following subsections describe each step.

1a 단계: SQL ServerSQL ServerStep 1a: Prerequisite If Using SQL ServerSQL Server

첫 번째 하위 섹션의 단계는 SQL ServerSQL Server를 실행 중인 경우에 적용되고 Azure SQL 데이터베이스Azure SQL Database에서 실행 중인 경우에는 적용되지 않습니다.The steps in this first subsection applies only if you are running in SQL ServerSQL Server, and does not apply if you are running in Azure SQL 데이터베이스Azure SQL Database. 다음을 수행합니다.Do the following:

  1. SQL Server Management Studio(SSMS.exe)를 사용하여 SQL ServerSQL Server에 연결하세요.Use SQL Server Management Studio (SSMS.exe) to connect to your SQL ServerSQL Server. 또는 SSMS.exe와 유사한 도구를 사용해도 됩니다.Or any tool similar to SSMS.exe is fine.

  2. 이름이 C:\data\\인 디렉터리를 수동으로 만듭니다.Manually create a directory named C:\data\. 샘플 Transact SQL 코드를 위해서는 미리 존재하는 디렉터리가 필요합니다.The sample Transact-SQL code expects the directory to pre-exist.

  3. 짧은 T-SQL을 실행하여 데이터베이스 및 메모리 최적화 파일 그룹을 생성하세요.Run the short T-SQL to create the database and its memory-optimized filegroup.

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  

1b 단계: Azure SQL 데이터베이스Azure SQL DatabaseStep 1b: Prerequisite If Using Azure SQL 데이터베이스Azure SQL Database

이 하위 섹션은 Azure SQL 데이터베이스Azure SQL Database를 사용하는 경우에만 적용됩니다.This subsection applies only if you are using Azure SQL 데이터베이스Azure SQL Database. 다음을 수행합니다.Do the following:

  1. 코드 예제로 사용할 기존 테스트 데이터베이스를 결정합니다.Decide which existing test database you will use for the code example.

  2. 새 테스트 데이터베이스를 만들려면 Azure 포털 을 사용하여 이름이 imoltp인 데이터베이스를 생성합니다.If you decide to create a new test database, use the Azure portal to create a database named imoltp.

    이를 위해 Azure 포털 사용 지침을 확인하려면 Azure SQL 데이터베이스 시작을 참조하십시오.If you would like instructions for using the Azure portal for this, see Get Started with Azure SQL Database.

2단계: 메모리 액세스에 최적화된 테이블과 NCSProc 만들기Step 2: Create Memory-Optimized Tables, and NCSProc

이 단계를 통해 메모리 최적화 테이블 및 고유하게 컴파일된 저장 프로시저(NCSProc)를 만들 수 있습니다.This step creates memory-optimized tables, and a natively compiled stored procedure (NCSProc). 다음을 수행합니다.Do the following:

  1. SSMS.exe를 사용하여 새 데이터베이스에 연결합니다.Use SSMS.exe to connect to your new database.

  2. 데이터베이스에서 다음 T-SQL을 실행합니다.Run the following T-SQL in your 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  

3단계: 코드 실행Step 3: Run the Code

이제 메모리 최적화 테이블의 성능을 보여주는 쿼리를 실행합니다.Now you can execute the queries that will demonstrate the performance of memory-optimized tables. 다음을 수행합니다.Do the following:

  1. SSMS.exe를 사용하여 데이터베이스에서 다음 T-SQL을 실행합니다.Use SSMS.exe to run the following T-SQL in your database.

    첫 번째 실행에서 생성되는 모든 속도 또는 기타 성능 데이터를 무시합니다.Ignore any speed or other performance data this first run generates. 첫 번째 실행에서는 메모리 초기 할당 등 여러 1회성 작업이 수행됩니다.The first run ensure several one-time only operations are performed, such as initial allocations of memory.

  2. SSMS.exe를 사용하여 데이터베이스에서 다음 T-SQL을 다시 실행합니다.Again, use SSMS.exe to rerun the following T-SQL in your 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  

다음은 두 번째 테스트 실행에서 생성된 출력 시간 통계입니다.Next are the output time statistics generated by our second test run.

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.  

참고 항목See Also

메모리 내 OLTP(메모리 내 최적화)In-Memory OLTP (In-Memory Optimization)