web-dev-qa-db-ja.com

SQL Server-ユーザー定義のテーブルタイプに含める非クラスター化インデックス?

インメモリのユーザー定義テーブルタイプを使用していて、それらにインデックスを作成することに行き詰まりました。

これが私がやろうとしていることです:

CREATE TYPE dbo.CustomersTbl
AS TABLE  
( 
        customerID int NOT NULL,
        customerName nvarchar(100),
        customerAddress nvarchar(100),
        customerCity nvarchar(100),
        customerEmail nvarchar(100)

        INDEX IDX1 NONCLUSTERED (customerID) INCLUDE(customerName,customerAddress,customerCity)
)

    WITH  
    (MEMORY_OPTIMIZED = ON); 

INCLUDE部分を含めない場合、これは正常に機能します。

これが標準のテーブルである場合、INCLUDEを使用してインデックスを作成します。

だから私の質問、INCLUDEを使用してユーザー定義テーブルタイプにそのインデックスを作成する方法はありますか、それとも私が作成したくない理由があるのでしょうか?これらのテーブルタイプを使用して、メモリ内のテーブル変数を作成しています。

現在SQL Server 2017を使用しています。

2
Sequenzia

INCLUDEは、メモリ最適化テーブルまたはテーブル変数ではサポートされていません。これらのオブジェクトの場合、INCLUDEの目的は重要ではありません。メモリ内の行の場所に到達すると、すべての列が利用可能になるためです。

メモリ最適化インデックスは本質的にカバーしています、 メモリ最適化インデックスのガイドライン を参照してください

ディスクベースのインデックスは、RIDまたはクラスター化インデックスキーのいずれかである行ロケーターを使用し、これらのコスト1〜4の論理IOに従って、ページのスロットテーブルでターゲット行を検索し、そこに移動します。インメモリインデックスの行ロケーターはポインターです。ポインタをたどると、100ns〜1000nsの範囲のどこかで、単一のCPU命令とメインメモリの読み取りにコストがかかります。

2
NedOtter