テーブルとストアド プロシージャのネイティブ コンパイルNative Compilation of Tables and Stored Procedures

インメモリ OLTP により、ネイティブ コンパイルという概念が導入されています。In-Memory OLTP introduces the concept of native compilation. SQL ServerSQL Server はメモリ最適化テーブルにアクセスするストアド プロシージャをネイティブにコンパイルできます。can natively compile stored procedures that access memory-optimized tables. SQL ServerSQL Server はメモリ最適化テーブルをネイティブにコンパイルすることもできます。is also able to natively compile memory-optimized tables. ネイティブ コンパイルは、(従来の) 解釈された Transact-SQLTransact-SQLよりも高速なデータ アクセスと効率的なクエリ実行を可能にします。Native compilation allows faster data access and more efficient query execution than interpreted (traditional) Transact-SQLTransact-SQL. テーブルとストアド プロシージャのネイティブ コンパイルを実行すると DLL が生成されます。Native compilation of tables and stored procedures produce DLLs.

メモリ最適化テーブル型のネイティブ コンパイルもサポートされています。Native compilation of memory optimized table types is also supported. 詳しくは、「 Memory-Optimized Table Variables」をご覧ください。For more information, see Memory-Optimized Table Variables.

ネイティブ コンパイルとは、プログラミングの構造をネイティブ コードに変換する処理であり、追加のコンパイルまたは解釈を必要としないプロセッサ命令で構成されます。Native compilation refers to the process of converting programming constructs to native code, consisting of processor instructions without the need for further compilation or interpretation.

インメモリ OLTP は、作成されたときにメモリ最適化テーブルを、そしてネイティブ DLL に読み込まれたときにネイティブ コンパイル ストアド プロシージャをコンパイルします。In-Memory OLTP compiles memory-optimized tables when they are created, and natively compiled stored procedures when they are loaded to native DLLs. また、DLL は、データベースまたはサーバーが再起動した後に再コンパイルされます。In addition, the DLLs are recompiled after a database or server restart. DLL を再作成するために必要な情報がデータベース メタデータに格納されます。The information necessary to recreate the DLLs is stored in the database metadata. DLL は、データベースに関連付けられていますが、データベースの一部ではありません。The DLLs are not part of the database, though they are associated with the database. たとえば、DLL は、データベース バックアップに含まれていません。For example, the DLLs are not included in database backups.

注意

メモリ最適化テーブルは、サーバーの再起動中に再コンパイルされます。Memory-optimized tables are recompiled during a server restart. データベースの復元を迅速に行うために、ネイティブ コンパイル ストアド プロシージャは、サーバーの再起動中に再コンパイルされず、最初の実行時にコンパイルされます。To speed up database recovery, natively compiled stored procedures are not recompiled during a server restart, they are compiled at the time of first execution. このようにコンパイルが延期されるため、ネイティブ コンパイル ストアド プロシージャは、最初の実行後に sys.dm_os_loaded_modules (Transact-SQL) を呼び出した場合にのみ表示されます。As a result of this deferred compilation, natively compiled stored procedures only appear when calling sys.dm_os_loaded_modules (Transact-SQL) after first execution.

インメモリ OLTP DLL のメンテナンスMaintenance of In-Memory OLTP DLLs

次のクエリは、サーバーのメモリに現在読み込まれているすべてのテーブルとストアド プロシージャ DLL を示します。The following query shows all table and stored procedure DLLs currently loaded in memory on the server:

SELECT name, description FROM sys.dm_os_loaded_modules  
where description = 'XTP Native DLL'  

ネイティブ コンパイルによって生成されたファイルをデータベース管理者が維持する必要はありません。Database administrators do not need to maintain files that are generated by a native compilation. SQL ServerSQL Server によって、不要になった生成ファイルが自動的に削除されます。automatically removes generated files that are no longer needed. たとえばテーブルやストアド プロシージャが削除されたとき、またはデータベースが削除されたときに、生成ファイルが削除されます。For example, generated files will be deleted when a table and stored procedure is deleted, or if a database is dropped.

注意

コンパイルが失敗するか、中断した場合、生成されたファイルの一部は削除されません。If compilation fails or is interrupted, some generated files are not removed. これらのファイルはサポート性のために意図的に残され、データベースが削除されるときに削除されます。These files are intentionally left behind for supportability and are removed when the database is dropped.

注意

データベースを起動している間に、SQL Server によってデータベースの復旧に必要なすべてのテーブルの Dll がコンパイルされます。During database startup, SQL Server compiles DLLs for all tables needed for database recovery. データベースを再起動する直前にテーブルが削除された場合、チェックポイント ファイルかトランザクション ログにテーブルの残存物が存在するため、データベースの起動中にテーブルの DLL が再コンパイルされる場合があります。If a table was dropped just prior to a database restart there can still be remnants of the table in the checkpoint files or the transaction log so the DLL for the table might be recompiled during database startup. 再起動後に DLL がアンロードされ、通常のクリーンアップ プロセスによってファイルが削除されます。After restart the DLL will be unloaded and the files will be removed by the normal cleanup process.

テーブルのネイティブ コンパイルNative Compilation of Tables

CREATE TABLE ステートメントを使用してメモリ最適化テーブルを作成すると、テーブル情報がデータベース メタデータに書き込まれ、テーブルとインデックス構造がメモリに作成されます。Creating a memory-optimized table using the CREATE TABLE statement results in the table information being written to the database metadata and the table and index structures created in memory. また、テーブルは DLL にコンパイルされます。The table will also be compiled to a DLL.

データベースとメモリ最適化テーブルを作成する、次のサンプル スクリプトについて考えてみます。Consider the following sample script, which creates a database and a memory-optimized table:

use master  
go  
create database db1  
go  
alter database db1 add filegroup db1_mod contains memory_optimized_data  
go  
-- adapt filename as needed  
alter database db1 add file (name='db1_mod', filename='c:\data\db1_mod') to filegroup db1_mod  
go  
use db1  
go  
create table dbo.t1  
   (c1 int not null primary key nonclustered,  
    c2 INT)  
with (memory_optimized=on)  
go  
-- retrieve the path of the DLL for table t1  
select name, description FROM sys.dm_os_loaded_modules  
where name like '%xtp_t_' + cast(db_id() as varchar(10)) + '_' + cast(object_id('dbo.t1') as varchar(10)) + '.dll'  
go  

テーブルを作成すると、テーブル DLL が作成され、メモリに DLL が読み込まれます。Creating the table also creates the table DLL and loads the DLL in memory. CREATE TABLE ステートメントの直後の DMV クエリは、テーブル DLL のパスを取得します。The DMV query immediately after the CREATE TABLE statement retrieves the path of the table DLL.

テーブル DLL は、テーブルのインデックス構造と行形式を理解します。The table DLL understands the index structures and row format of the table. SQL ServerSQL Server は DLL を使用してインデックスをスキャンし、行を取得し、行のコンテンツを格納します。uses the DLL for traversing indexes, retrieving rows, as well as storing the contents of the rows.

ストアド プロシージャのネイティブ コンパイルNative Compilation of Stored Procedures

NATIVE_COMPILATION が設定されているストアド プロシージャはネイティブでコンパイルされます。Stored procedures that are marked with NATIVE_COMPILATION are natively compiled. つまり、パフォーマンスが重要なビジネス ロジックの効率的な実行のために、プロシージャの Transact-SQLTransact-SQL ステートメントがすべてネイティブ コードにコンパイルされます。This means the Transact-SQLTransact-SQL statements in the procedure are all compiled to native code for efficient execution of performance-critical business logic.

ネイティブ コンパイル ストアド プロシージャの詳細については、「 Natively Compiled Stored Procedures」をご覧ください。For more information about natively compiled stored procedures, see Natively Compiled Stored Procedures.

前の例のテーブル t1 に行を挿入する、次のサンプル ストアド プロシージャについて考えてみます。Consider the following sample stored procedure, which inserts rows in the table t1 from the previous example:

create procedure dbo.native_sp  
with native_compilation, schemabinding, execute as owner  
as  
begin atomic  
with (transaction isolation level=snapshot, language=N'us_english')  
  
  declare @i int = 1000000  
  while @i > 0  
  begin  
    insert dbo.t1 values (@i, @i+1)  
    set @i -= 1  
  end  
  
end  
go  
exec dbo.native_sp  
go  
-- reset  
delete from dbo.t1  
go  

行をできる限り高速に挿入するために、native_sp の DLL は t1 の DLL およびインメモリ OLTP ストレージ エンジンと直接やり取りできます。The DLL for native_sp can interact directly with the DLL for t1, as well as the In-Memory OLTP storage engine, to insert the rows as fast as possible.

インメモリ OLTP コンパイラは、ストアド プロシージャの各クエリに有効な実行プランを作成するためにクエリ オプティマイザーを活用します。The In-Memory OLTP compiler leverages the query optimizer to create an efficient execution plan for each of the queries in the stored procedure. テーブルのデータが変更された場合はネイティブ コンパイル ストアド プロシージャは自動的に再コンパイルされないことに注意してください。Note that natively compiled stored procedures are not automatically recompiled if the data in the table changes. インメモリ OLTP の統計とストアド プロシージャの管理の詳細については、「 メモリ最適化テーブルの統計」を参照してください。For more information on maintaining statistics and stored procedures with In-Memory OLTP see Statistics for Memory-Optimized Tables.

ネイティブ コンパイルにおけるセキュリティの注意点Security Considerations for Native Compilation

テーブルおよびストアド プロシージャのネイティブ コンパイルでは、インメモリ OLTP コンパイラを使用します。Native compilation of tables and stored procedures uses the In-Memory OLTP compiler. このコンパイラはファイルを生成し、そのファイルがディスクに書き込まれて、メモリに読み込まれます。This compiler produces files that are written to disk and loaded into memory. SQL ServerSQL Server では、これらのファイルへのアクセスを制限するために、次のメカニズムを使用しています。uses the following mechanisms to limit access to these files.

ネイティブ コンパイラNative Compiler

コンパイラの実行可能ファイルと、ネイティブ コンパイルに必要なバイナリおよびヘッダー ファイルは、 SQL ServerSQL Server インスタンスの一部として MSSQL\Binn\Xtp フォルダー内にインストールされます。The compiler executable, as well as binaries and header files required for native compilation are installed as part of the SQL ServerSQL Server instance under the folder MSSQL\Binn\Xtp. そのため、C:\Program Files の下で、既定のインスタンスをインストールする場合、コンパイラ ファイルが C:\Program Files にインストールされます\MicrosoftMicrosoftSQL ServerSQL Server\mssql12. します。MSSQLSERVER\MSSQL\Binn\Xtp します。So, if the default instance is installed under C:\Program Files, the compiler files are installed in C:\Program Files\MicrosoftMicrosoftSQL ServerSQL Server\MSSQL12.MSSQLSERVER\MSSQL\Binn\Xtp.

コンパイラへのアクセスを制限するために、 SQL ServerSQL Server では、バイナリ ファイルへのアクセスを制限するアクセス制御リスト (ACL) が使用されます。To limit access to the compiler, SQL ServerSQL Server uses access control lists (ACLs) to restrict access to binary files. SQL ServerSQL Server のすべてのバイナリは、変更や改ざんが起こらないよう ACL で保護されています。All SQL ServerSQL Server binaries are protected against modification or tampering through ACLs. ネイティブ コンパイラの ACL では、コンパイラの使用も制限されます。ネイティブ コンパイラ ファイルに対する読み取り権限と実行権限を持っているのは、 SQL ServerSQL Server サービス アカウントとシステム管理者のみです。The native compiler's ACLs also limit use of the compiler; only the SQL ServerSQL Server service account and system administrators have read and execute permissions for native compiler files.

ネイティブ コンパイルによって生成されるファイルFiles Generated by a Native Compilation

テーブルまたはストアド プロシージャのコンパイル時に生成されるファイルには、DLL のほか、.c、.obj、.xml、.pdb などの拡張子を持つ中間ファイルがあります。The files produced when a table or stored procedure is compiled include the DLL and intermediate files including files with the following extensions: .c, .obj, .xml, and .pdb. 生成されたファイルは、既定のデータ フォルダーのサブフォルダーに保存されます。The generated files are saved in a subfolder of the default data folder. サブフォルダーは Xtp と呼ばれます。The subfolder is called Xtp. 既定のデータ フォルダーの既定のインスタンスをインストールするときに生成されたファイルが C:\Program files に配置されます\MicrosoftMicrosoftSQL ServerSQL Server\mssql12. します。MSSQLSERVER\MSSQL\DATA\Xtp します。When installing the default instance with the default data folder, the generated files are placed in C:\Program Files\MicrosoftMicrosoftSQL ServerSQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\Xtp.

SQL ServerSQL Server は 3 とおりの方法で、生成した DLL に対する改ざんを回避します。prevents tampering with the generated DLLs in three ways:

  • テーブルまたはストアド プロシージャが DLL にコンパイルされると、この DLL は直ちにメモリに読み込まれ、sqlserver.exe プロセスにリンクされます。When a table or stored procedure is compiled to a DLL, this DLL is immediately loaded into memory and linked to the sqlserver.exe process. プロセスにリンクされている間、その DLL は変更できません。A DLL cannot be modified while it is linked to a process.

  • データベースを再起動すると、データベースのメタデータに基づいて、すべてのテーブルとストアド プロシージャが再コンパイル (削除後、再作成) されます。When a database is restarted, all tables and stored procedures are recompiled (removed and recreated) based on the database metadata. これにより、生成されたファイルに対して悪意のあるエージェントによって行われた変更があれば、すべて削除されます。This will remove any changes made to a generated file by a malicious agent.

  • 生成されたファイルはユーザー データの一部と見なされ、ACL を介して、データベース ファイルと同じセキュリティ制限が適用されます。これらのファイルにアクセスできるのは、 SQL ServerSQL Server サービス アカウントとシステム管理者のみです。The generated files are considered part of user data, and have the same security restrictions, via ACLs, as database files: only the SQL ServerSQL Server service account and system administrators can access these files.

これらのファイルの管理には、ユーザー操作は不要です。No user interaction is needed to manage these files. SQL ServerSQL Server により、必要に応じてファイルの作成および削除が行われます。will create and remove the files as necessary.

参照See Also

メモリ最適化テーブル Memory-Optimized Tables
Natively Compiled Stored ProceduresNatively Compiled Stored Procedures