다음을 통해 공유


데모: In-Memory OLTP의 성능 향상

이 예제에서는 메모리 최적화 및 기존 디스크 기반 테이블에 대해 동일한 Transact-SQL 쿼리를 실행할 때 응답 시간의 차이를 비교하여 In-Memory OLTP를 사용할 때 성능이 향상되었음을 보여 줍니다. 또한 고유하게 컴파일된 저장 프로시저도 생성되고(동일한 쿼리를 기반으로) 실행하여 고유하게 컴파일된 저장 프로시저를 사용하여 메모리 최적화 테이블을 쿼리할 때 일반적으로 최상의 응답 시간을 얻을 수 있음을 보여 줍니다. 이 샘플은 메모리 최적화 테이블의 데이터에 액세스할 때 성능 향상의 한 가지 측면만 보여 줍니다. 삽입을 수행할 때 데이터 액세스 효율성 이 샘플은 단일 스레드이며 In-Memory OLTP의 동시성 이점을 활용하지 않습니다. 동시성을 사용하는 워크로드는 더 큰 성능 향상을 볼 수 있습니다.

비고

메모리 최적화 테이블을 보여주는 또 다른 샘플은 SQL Server 2014 In-Memory OLTP 샘플에서 사용할 수 있습니다.

이 샘플을 완료하려면 다음을 수행합니다.

  1. imoltp라는 데이터베이스를 만들고 파일 세부 정보를 변경하여 In-Memory OLTP를 사용하도록 설정합니다.

  2. 샘플에 대한 데이터베이스 개체( 세 개의 테이블 및 고유하게 컴파일된 저장 프로시저)를 만듭니다.

  3. 다른 쿼리를 실행하고 각 쿼리에 대한 응답 시간을 표시합니다.

예제에 대해 imoltp 데이터베이스를 설정하려면 먼저 빈 폴더 c:\imoltp_data 만든 다음, 다음 코드를 실행합니다.

USE master  
GO  
  
-- Create a new database.  
CREATE DATABASE imoltp  
GO  
  
-- Prepare the database for In-Memory OLTP by  
-- adding a memory-optimized filegroup to the database.  
ALTER DATABASE imoltp ADD FILEGROUP imoltp_file_group  
    CONTAINS MEMORY_OPTIMIZED_DATA;  
  
-- Add a file (to hold the memory-optimized data) to the new filegroup.  
ALTER DATABASE imoltp ADD FILE (name='imoltp_file', filename='c:\imoltp_data\imoltp_file')  
    TO FILEGROUP imoltp_file_group;  
GO  
  

다음으로, 다음 코드를 실행하여 디스크 기반 테이블, 두 개의 (2) 메모리 최적화 테이블 및 다른 데이터 액세스 방법을 보여 주는 데 사용할 고유하게 컴파일된 저장 프로시저를 만듭니다.

USE imoltp  
GO  
  
-- If the tables or stored procedure already exist, drop them to start clean.  
IF EXISTS (SELECT NAME FROM sys.objects WHERE NAME = 'DiskBasedTable')  
   DROP TABLE [dbo].[DiskBasedTable]  
GO  
  
IF EXISTS (SELECT NAME FROM sys.objects WHERE NAME = 'InMemTable')  
   DROP TABLE [dbo].[InMemTable]  
GO  
  
IF EXISTS (SELECT NAME FROM sys.objects  WHERE NAME = 'InMemTable2')  
   DROP TABLE [dbo].[InMemTable2]  
GO  
  
IF EXISTS (SELECT NAME FROM sys.objects  WHERE NAME = 'usp_InsertData')  
   DROP PROCEDURE [dbo].[usp_InsertData]  
GO  
  
-- Create a traditional disk-based table.  
CREATE TABLE [dbo].[DiskBasedTable] (  
  c1 INT NOT NULL PRIMARY KEY,  
  c2 NCHAR(48) NOT NULL  
)  
GO  
  
-- Create a memory-optimized table.  
CREATE TABLE [dbo].[InMemTable] (  
  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 a 2nd memory-optimized table.  
CREATE TABLE [dbo].[InMemTable2] (  
  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 a natively-compiled stored procedure.  
CREATE PROCEDURE [dbo].[usp_InsertData]   
  @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].[inMemTable2](c1,c2) VALUES (@i, @c);  
    SET @i += 1;  
  END  
END  
GO  
  

설정이 완료되었으며 데이터 액세스 방법 간의 성능을 비교하는 응답 시간을 표시하는 쿼리를 실행할 준비가 된 것입니다.

예제를 완료하려면 다음 코드를 여러 번 실행합니다. 초기 메모리 할당에 의해 부정적인 영향을 받는 첫 번째 실행의 결과를 무시합니다.

SET STATISTICS TIME OFF;  
SET NOCOUNT ON;  
  
-- Delete data from all tables to reset the example.  
DELETE FROM [dbo].[DiskBasedTable]   
    WHERE [c1]>0  
GO  
DELETE FROM [dbo].[inMemTable]   
    WHERE [c1]>0  
GO  
DELETE FROM [dbo].[InMemTable2]   
    WHERE [c1]>0  
GO  
  
-- Declare parameters for the test queries.  
DECLARE @i INT = 1;  
DECLARE @rowcount INT = 100000;  
DECLARE @c NCHAR(48) = N'12345678901234567890123456789012345678';  
DECLARE @timems INT;  
DECLARE @starttime datetime2 = sysdatetime();  
  
-- Disk-based table queried with interpreted Transact-SQL.  
BEGIN TRAN  
  WHILE @I <= @rowcount  
  BEGIN  
    INSERT INTO [dbo].[DiskBasedTable](c1,c2) VALUES (@i, @c);  
    SET @i += 1;  
  END  
COMMIT  
  
SET @timems = datediff(ms, @starttime, sysdatetime());  
SELECT CAST(@timems AS VARCHAR(10)) + ' ms (disk-based table with interpreted Transact-SQL).';  
  
-- Memory-optimized table queried with interpreted Transact-SQL.  
SET @i = 1;  
SET @starttime = sysdatetime();  
  
BEGIN TRAN  
  WHILE @i <= @rowcount  
    BEGIN  
      INSERT INTO [dbo].[InMemTable](c1,c2) VALUES (@i, @c);  
      SET @i += 1;  
    END  
COMMIT  
  
SET @timems = datediff(ms, @starttime, sysdatetime());  
SELECT CAST(@timems AS VARCHAR(10)) + ' ms (memory-optimized table with interpreted Transact-SQL).';  
  
-- Memory-optimized table queried with a natively-compiled stored procedure.  
SET @starttime = sysdatetime();  
  
EXEC usp_InsertData @rowcount, @c;  
  
SET @timems = datediff(ms, @starttime, sysdatetime());  
SELECT CAST(@timems AS VARCHAR(10)) + ' ms (memory-optimized table with natively-compiled stored procedure).';  
  

예상 결과는 메모리 최적화 테이블과 고유하게 컴파일된 저장 프로시저를 사용하는 것이 일반적으로 기존 디스크 기반 테이블에 대해 실행되는 동일한 워크로드보다 일관되게 더 빠른 응답 시간을 제공하는 방법을 보여 주는 실제 응답 시간을 제공합니다.

또한 참조하십시오

In-Memory OLTP를 보여 주는 AdventureWorks 확장
메모리 내 OLTP(메모리 내 최적화)
메모리 최적화 테이블
고유하게 컴파일된 저장 프로시저
메모리 액세스에 최적화된 테이블 사용을 위한 요구 사항
CREATE DATABASE(SQL Server Transact-SQL)
ALTER DATABASE 파일 및 파일 그룹 옵션(Transact-SQL)
CREATE PROCEDURE 및 Memory-Optimized 테이블