適用対象: SQL Server 2025 (17.x) プレビュー
SQL Server 2025 (17.x) プレビューで、指定したテーブルと列に JSON インデックスを作成します。
JSON インデックス:
- テーブルにデータがある前に作成できます。
- 修飾されたデータベース名を指定することで、別のデータベースのテーブルに対して作成できます。
- テーブルにクラスター化された主キーが必要です。
- インデックス付きビューでは指定できません。
注
JSON インデックスの作成は現在プレビュー段階であり、SQL Server 2025 (17.x) プレビューでのみ使用できます。
構文
CREATE JSON INDEX name ON table_name (json_column_name)
[ FOR ( sql_json_path [ , ...n ] ) ]
[ WITH ( <json_index_option> [ , ...n ] ) ]
[ ON { filegroup_name | "default" } ]
[ ; ]
<object> ::=
{ database_name.schema_name.table_name | schema_name.table_name | table_name }
<sql_json_path> ::=
{ character_string_literal }
<json_index_option> ::=
{
FILLFACTOR = fillfactor
| DROP_EXISTING = { ON | OFF }
| ONLINE = OFF
| ALLOW_ROW_LOCKS = { ON | OFF }
| ALLOW_PAGE_LOCKS = { ON | OFF }
| MAXDOP = max_degree_of_parallelism
| DATA_COMPRESSION = { NONE | ROW | PAGE }
}
論争
インデックス名
インデックスの名前です。 インデックス名はテーブル内で一意である必要がありますが、データベース内で一意である必要はありません。 インデックス名は 、識別子の規則に従う必要があります。
ON <object> ( json_column_name )
インデックスを作成するオブジェクト (データベース、スキーマ、またはテーブル) と json 列の名前を指定します。
json_column_name
指定した SQL/JSON パスを 0 個以上含むの
table_name
データ型の列の名前。sql_json_path
json_column_name
から抽出してインデックスを作成する必要がある SQL/JSON パス。sql_json_path
の規定値は$
です。- 指定したパス以降のすべてのキー/値のインデックスを再帰的に作成します。
- JSON ドキュメント パスで最大 128 レベルをサポートします。
- 重複は許可されません。
たとえば、
$.a
と$.a.b
は、パス$.a
すべてのパスが再帰的に含まれており、ユーザーの意図が不明であるため、エラーが発生します。
ON filegroup_name
指定したファイル グループに、指定したインデックスを作成します。 場所が指定されておらず、テーブルがパーティション分割されていない場合、インデックスは基になるテーブルと同じファイル グループを使用します。 ファイル グループは既に存在している必要があります。
ON「デフォルト」
指定したインデックスを既定のファイル グループに作成します。
このコンテキストでは、default という用語はキーワードではありません。 これは既定のファイル グループの識別子であり、 ON "default"
や ON [default]
のように区切る必要があります。
"default"
を指定する場合は、現在のセッションに対して QUOTED_IDENTIFIER
オプションをON
する必要があります。 これが既定の設定です。 詳細については、「SET QUOTED_IDENTIFIER」を参照してください。
<object>:: =
インデックス付けされる完全修飾オブジェクトまたは非完全修飾オブジェクト。
database_name
データベースの名前。
schema_name
テーブルが属しているスキーマの名前です。
table_name
インデックスを作成するテーブルの名前。
FILLFACTOR = fillfactor
インデックスの作成時または再構築時に、データベース エンジン が各インデックス ページのリーフ レベルをどの程度まで埋めるかを、パーセント値で指定します。
fillfactor は、 1
から 100
までの整数値である必要があります。 既定値は 0
です。
フィルファクターが100
または0
の場合、データベース エンジンは、容量に満ちたリーフ ページを含むインデックスを作成します。
注
0
と100
の塗りつぶし係数の値は、すべての点で同じです。
FILLFACTOR
の設定は、インデックスが作成または再構築されるときにのみ適用されます。 データベース エンジンでは、ページ内で指定されたパーセント分の空き領域は動的に保持されません。 塗りつぶし係数の設定を表示するには、 sys.indexes カタログ ビューを使用します。
FILLFACTOR
が100
未満のクラスター化インデックスを作成すると、データベース エンジンがクラスター化インデックスの作成時にデータを再配布するため、データが占有するストレージ領域の量に影響します。
詳細については、「 インデックスの FILL FACTOR の指定」を参照してください。
DROP_EXISTING = { ON |OFF }
既存の名前付き空間インデックスを削除して再構築することを指定します。 既定値は OFF
です。
オン
既存のインデックスが削除され、再構築されます。 指定するインデックス名は、現在既存のインデックスと同じである必要があります。ただし、インデックス定義は変更できます。 たとえば、さまざまな列、並べ替え順序、パーティション構成、またはインデックス オプションを指定できます。
オフ
指定したインデックス名が既に存在する場合は、エラーが表示されます。
DROP_EXISTING
を使用してインデックスの種類を変更することはできません。
オンライン = オフ
インデックス操作中に、基になるテーブルと関連するインデックスをクエリやデータ変更に使用できないことを指定します。 このバージョンの SQL Server では、オンライン インデックス ビルドは JSON インデックスではサポートされていません。 このオプションを JSON インデックスの ON
に設定すると、エラーが発生します。
ONLINE
オプションを省略するか、ONLINE
をOFF
に設定します。
JSON インデックスを作成、再構築、または削除するオフライン インデックス操作では、テーブルに対するスキーマ変更 (Sch-M) ロックが取得されます。 このため、操作中は、すべてのユーザーは基になるテーブルにアクセスできません。
オンライン インデックス操作は、SQL Server のすべてのエディションで使用できるわけではありません。
Windows の SQL Server の各エディションでサポートされる機能のリストについては、以下を参照してください。
- SQL Server 2025 プレビューのエディションとサポートされている機能
- SQL Server 2022 の各エディションとサポートされている機能
- SQL Server 2019 の各エディションとサポートされている機能
- エディションと SQL Server 2017 のサポートされる機能
- エディションと SQL Server 2016 のサポートされる機能
ALLOW_ROW_LOCKS = { ON |OFF }
行ロックを許可するかどうかを指定します。 既定値は ON
です。
オン
インデックスにアクセスするとき、行ロックが許可されます。 いつ行ロックを使用するかは、データベース エンジンによって決定されます。
オフ
行ロックは使用されません。
ALLOW_PAGE_LOCKS = { ON |OFF }
ページ ロックを許可するかどうかを指定します。 既定値は ON
です。
オン
ページにアクセスするとき、行ロックが許可されます。 いつページ ロックを使用するかは、データベース エンジン によって決定されます。
オフ
ページ ロックは使用されません。
MAXDOP = max_degree_of_parallelism
インデックス操作の間、 max degree of parallelism
構成オプションをオーバーライドします。 並列プランの実行で使用されるプロセッサの数を制限するには、 MAXDOP
を使用します。 最大は 64 プロセッサです。
Von Bedeutung
MAXDOP
オプションは構文的にサポートされていますが、現在CREATE SPATIAL INDEX
は常に 1 つのプロセッサのみを使用します。
max_degree_of_parallelism には、次のいずれかの値を指定できます。
価値 | 説明 |
---|---|
1 |
並列プラン生成を抑制します。 |
>1 |
現在のシステム ワークロードに基づいて、並列インデックス操作で使用される最大プロセッサ数を指定の数以下に制限します。 |
0 (既定値) |
現在のシステム ワークロードに基づいて、実際の数以下のプロセッサを使用します。 |
詳細については、「 並列インデックス操作の構成」を参照してください。
並列インデックス操作は、SQL Server のすべてのエディションで使用できるわけではありません。
Windows の SQL Server の各エディションでサポートされる機能のリストについては、以下を参照してください。
- SQL Server 2025 プレビューのエディションとサポートされている機能
- SQL Server 2022 の各エディションとサポートされている機能
- SQL Server 2019 の各エディションとサポートされている機能
- エディションと SQL Server 2017 のサポートされる機能
- エディションと SQL Server 2016 のサポートされる機能
DATA_COMPRESSION = { NONE |ROW |PAGE }
インデックスによって使用されるデータ圧縮のレベルを決定します。
何一つ
インデックスによってデータに対して圧縮が使用されない
漕ぐ
インデックスによってデータに使用される行圧縮
ページ
インデックスがデータに適用するページ圧縮
注釈
すべてのオプションは、 CREATE JSON INDEX
ステートメントごとに 1 回だけ指定できます。 任意のオプションの重複を指定すると、エラーが発生します。
[ ON { filegroup_name |"default" } ]
JSON インデックスのファイル グループを指定すると、テーブルのパーティション構成に関係なく、そのファイル グループにインデックスが配置されます。
インデックスの作成の詳細については、 CREATE INDEX の「解説」セクションを参照してください。
JSON インデックスでサポートされる述語
JSON 列に JSON インデックスが存在する場合、テーブル内の json 列に含まれる JSON ドキュメントに対する検索 操作を最適化 できます。 JSON インデックスは、さまざまな JSON 関数ベースの式を含むクエリで使用されます。
次の例では、Sales.SalesOrderHeader
データベースの AdventureWorks2022
テーブルと、 という Info
列を使用します。
Info
列は json 型として作成されます。 既定の設定を使用して、 Info
列にも JSON インデックスが作成されます。 次のコード サンプルは、 CREATE JSON INDEX
ステートメントを示しています。
CREATE JSON INDEX sales_info_idx ON Sales.SalesOrderHeader(Info);
サンプルの検索式では、次の JSON ドキュメントをデータとして使用します。
受注番号 | 情報 |
---|---|
437 |
{"Customer":{"Name":"Kelsey Raje","ID":16517,"Type":"IN"},"Order":{"ID":43710,"Number":"SO43710","CreationDate":"2011-06-02T00:00:00","TotalDue":3953.9884}} |
643 |
{"Customer":{"Name":"Aaron Campbell","ID":16167,"Type":"IN"},"Order":{"ID":64304,"Number":"SO64304","CreationDate":"2014-01-16T00:00:00","TotalDue":36.0230, "IsProcessed": true}} |
JSON_PATH_EXISTS関数
JSON_PATH_EXISTS関数を使用して、指定した SQL/JSON パスが JSON ドキュメントに存在するかどうかをテストします。
このクエリでは、JSON インデックスを使用して最適化できる JSON_PATH_EXISTS
列のを示します。
SELECT COUNT(*)
FROM Sales.SalesOrderHeader
WHERE JSON_PATH_EXISTS(Info, '$.Order.IsProcessed') = 1;
JSON インデックスは、 JSON_PATH_EXISTS
述語と次の演算子でサポートされています。
- 比較演算子 (
=
) -
IS [NOT] NULL
述語 (現在サポートされていません)
JSON_VALUE関数
JSON_VALUEを使用して、JSON ドキュメント内の指定された SQL/JSON パス内の JSON テキスト/スカラー値を抽出します。 次のクエリは、JSON インデックスを使用して JSON_VALUE
列の式を最適化する方法を示しています。
オブジェクト プロパティ内の JSON 文字列の等値検索:
SELECT COUNT(*) FROM Sales.SalesOrderHeader WHERE JSON_VALUE(Info, '$.Customer.Type') = 'IN';
値を int データ型に変換した後、オブジェクト プロパティ内の JSON 番号を等値検索します。
SELECT * FROM Sales.SalesOrderHeader WHERE JSON_VALUE(Info, '$.Customer.ID' RETURNING INT) = 16167;
値を int データ型に変換した後、オブジェクト プロパティ内の JSON 番号を範囲検索します。
SELECT * FROM Sales.SalesOrderHeader WHERE JSON_VALUE(Info, '$.Customer.ID' RETURNING INT) IN (16167, 16517);
値を 10 進 データ型に変換した後、オブジェクト プロパティ内の JSON 番号を範囲検索します。
SELECT * FROM Sales.SalesOrderHeader WHERE JSON_VALUE(Info, '$.Order.TotalDue RETURNING decimal(20, 4)) BETWEEN 1000 and 2000;
JSON インデックスは、 JSON_VALUE
述語と次の演算子でサポートされています。
- 比較演算子 (
=
) -
LIKE
述語 (現在サポートされていません) -
IS [NOT] NULL
述語 (現在サポートされていません)
JSON_CONTAINS関数
JSON_CONTAINS関数は、JSON 列に存在する場合に JSON インデックスを使用できる JSON ドキュメント内の JSON 値の簡単な検索をサポートします。 この関数を使用して、JSON ドキュメント内の指定された SQL/JSON パスに JSON スカラー値、オブジェクト、または配列が含まれているかどうかをテストできます。 SQL スカラー型として指定された検索値は、既存の SQL/JSON 型変換ごとに変換されます。 これらのルールは、動作セクションで定義されています。
要件
JSON 列を含むテーブルには、クラスタリング キーが必要です。 クラスタリング キーがない場合は、エラーが発生します。 クラスタリング キーは 31 列に制限されており、インデックス キーの最大サイズは 128 バイト未満にする必要があります。
権限
ユーザーは、テーブルに対する ALTER
権限を持っているか、 sysadmin 固定サーバー ロールのメンバーであるか、固定データベース ロール のdb_ddladmin および db_owner されている必要があります。
制限事項
JSON インデックス ステートメントには、次の制限があります。
- テーブル内の json 列に作成できる JSON インデックスは 1 つだけです。
- テーブルには最大 249 個の JSON インデックスを作成できます。 特定の JSON 列に対して複数の JSON インデックスを作成することはサポートされていません。
- JSON インデックスは、計算された json 列に作成できません。
- JSON インデックスは、ビュー、テーブル値変数、またはメモリ最適化テーブルの json 列に作成できません。
- JSON インデックスは、オフラインの方法でのみ作成または変更できます。
- JSON パスはインデックス定義内で重複できません。 たとえば、
$a
と$a.b
が重複しており、CREATE JSON INDEX
ステートメントでは使用できません。 - パスを変更するには、JSON インデックスを再作成する必要があります。
- JSON インデックスは、インデックス ヒントではサポートされていません。
- データ圧縮オプションはサポートされていません。
例示
A。 JSON 列に JSON インデックスを作成する
次の例では、docs
json 型の列を含む content
という名前のテーブルを作成します。 次に、json_content_index
列に JSON インデックス (content
) を作成します。 この例では、 JSON ドキュメント全体または JSON ドキュメント内のすべての SQL/JSON パスに json インデックスを作成します。
DROP TABLE IF EXISTS docs;
CREATE TABLE docs (content JSON, id INT PRIMARY KEY);
CREATE JSON INDEX json_content_index ON docs(content);
A。 特定のパスを持つ JSON 列に JSON インデックスを作成する
次の例では、docs
json 型の列を含む content
という名前のテーブルを作成します。 次に、json_content_index
列に JSON インデックス (content
) を作成します。 この例では、 JSON ドキュメント内の特定の SQL/JSON パスに json インデックスを作成します。
この例では、インデックス FILLFACTOR を 80
に設定します。
DROP TABLE IF EXISTS docs;
CREATE TABLE docs (content JSON, id INT PRIMARY KEY);
CREATE JSON INDEX json_content_index
ON docs(content) FOR ('$.a', '$.b')
WITH (FILLFACTOR = 80);