いくつかの例外を除き、Transact-SQL クエリまたは DML 操作 (SELECT、INSERT、UPDATE、DELETE)、アドホック バッチ、およびストアド プロシージャ、テーブル値関数、トリガー、ビューなどの SQL モジュールを使用して、メモリ最適化テーブルにアクセスできます。
インタープリターによって処理される Transact-SQL とは、ネイティブ コンパイル ストアド プロシージャとは異なる、Transact-SQL バッチまたはストアド プロシージャを意味します。 インタープリターによって処理される Transact-SQL による、メモリ最適化されたテーブルへのアクセスは、相互運用アクセスと呼ばれます。
メモリ最適化テーブルには、ネイティブ コンパイル ストアド プロシージャを使用してアクセスすることもできます。 ネイティブ コンパイル ストアド プロシージャは、パフォーマンスが重要な OLTP 操作に推奨されます。
解釈された Transact-SQL によるアクセスは、次のシナリオにお勧めします。
アドホック クエリおよび管理タスク。
レポート クエリ。通常、ネイティブ コンパイル ストアド プロシージャ (ウィンドウ関数など) では使用できないコンストラクトを使用します。
アプリケーション コードの変更を最小限に抑えて (またはコードを変更することなく)、アプリケーションのパフォーマンスが重要な部分をメモリ最適化テーブルに移行するには、次の手順を実行します。 テーブルを移行すると、パフォーマンス向上を確認できることがあります。 ストアド プロシージャをネイティブ コンパイル ストアド プロシージャに移行すると、いっそうのパフォーマンス向上が確認されることがあります。
ネイティブ コンパイル ストアド プロシージャでは、Transact-SQL を使用できません。
次の Transact-SQL コンストラクトは、メモリ最適化テーブル内のデータにアクセスする解釈 Transact-SQL ストアド プロシージャではサポートされていません。
面積 | サポートされていない |
---|---|
テーブルへのアクセス | トランケート テーブル MERGE (ターゲットとしてのメモリ最適化テーブル) 動的カーソルおよびキーセット カーソル (これらは自動的に静的カーソルに降格されます)。 コンテキスト接続を使用した CLR モジュールからのアクセス。 インデックス付きビューから、メモリ最適化されたテーブルへの参照。 |
複数のデータベース間 | 複数データベース間のクエリ データベースにまたがるトランザクション リンク サーバー |
テーブル ヒント
テーブル ヒントの詳細については、 テーブル ヒント (Transact-SQL) In-Memory OLTP をサポートするために SNAPSHOT 分離が追加されました。
次のテーブル ヒントは、解釈された Transact-SQL を使用してメモリ最適化テーブルにアクセスする場合はサポートされません。
ホールドロック (HOLDLOCK) | IGNORE_CONSTRAINTS | トリガーを無視 | NOWAIT |
PAGLOCK | READCOMMITTED | 読み込みコミットロック | READPAST |
READUNCOMMITTED | ROWLOCK | SPATIAL_WINDOW_MAX_CELLS = 整数 | タブロック |
TABLOCKXX | UPDLOCK | XLOCK |
解釈された Transact-SQL を使用して明示的または暗黙的なトランザクションからメモリ最適化テーブルにアクセスする場合は、SNAPSHOT、REPEATABLEREAD、SERIALIZABLE などの分離レベルのテーブル ヒントを含める必要があります。また、MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOTを使用することもできます。 詳細については、「Memory-Optimized テーブルと ALTER DATABASE SET オプションを使用したトランザクション分離レベルのガイドライン (Transact-SQL)」を参照してください。
注
自動コミット モードで実行されているクエリによってアクセスされるメモリ最適化テーブルには、分離レベルのテーブル ヒントは必要ありません。