次の方法で共有


実証: インメモリ OLTP によるパフォーマンスの向上

この例では、メモリ最適化テーブルと従来のディスク ベース テーブルに対して同じ Transact-SQL クエリを実行するときの応答時間の違いを比較することで、In-Memory OLTP を使用するときのパフォーマンスの向上を示します。 さらに、ネイティブ コンパイル ストアド プロシージャも (同じクエリに基づいて) 作成され、ネイティブ コンパイル ストアド プロシージャを使用してメモリ最適化テーブルに対してクエリを実行するときに、通常は最適な応答時間を得ることを示すために実行されます。 このサンプルでは、メモリ最適化テーブルのデータにアクセスするときのパフォーマンス向上の 1 つの側面のみを示します。挿入を実行するときのデータ アクセス効率。 このサンプルはシングル スレッドであり、In-Memory OLTP のコンカレンシーの利点を利用していません。 コンカレンシーを使用するワークロードでは、さらにパフォーマンスが向上します。

メモリ最適化テーブルを示す別のサンプルは、 SQL Server 2014 In-Memory OLTP サンプルで入手できます。

このサンプルを完了するには、次の手順を実行します。

  1. imoltp という名前のデータベースを作成し、そのファイルの詳細を変更して、In-Memory OLTP を使用するように設定します。

  2. サンプルのデータベース オブジェクト (3 つのテーブルとネイティブ コンパイル ストアド プロシージャ) を作成します。

  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 つの (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).';  
  

予想される結果は、メモリ最適化テーブルとネイティブ コンパイル ストアド プロシージャを使用する方法を示す実際の応答時間を提供します。通常、従来のディスク ベースのテーブルに対して実行されている同じワークロードよりも一貫して高速な応答時間が提供されます。

こちらもご覧ください

AdventureWorks の In-Memory OLTP を示す拡張機能
インメモリ OLTP (インメモリ最適化)
メモリ最適化テーブル
ネイティブ コンパイル ストアド プロシージャ
メモリ最適化テーブルを使用するための要件
CREATE DATABASE (SQL Server Transact-SQL)
ALTER DATABASE の File および Filegroup オプション (Transact-SQL)
CREATE PROCEDURE と Memory-Optimized テーブル