次の方法で共有


JSONインデックスを作成 (Transact-SQL)

適用対象: SQL Server 2025 (17.x) プレビュー

SQL Server 2025 (17.x) プレビューで、指定したテーブルと列に JSON インデックスを作成します。

JSON インデックス:

  • テーブルにデータがある前に作成できます。
  • 修飾されたデータベース名を指定することで、別のデータベースのテーブルに対して作成できます。
  • テーブルにクラスター化された主キーが必要です。
  • インデックス付きビューでは指定できません。

JSON インデックスの作成は現在プレビュー段階であり、SQL Server 2025 (17.x) プレビューでのみ使用できます。

Transact-SQL 構文表記規則

構文

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の場合、データベース エンジンは、容量に満ちたリーフ ページを含むインデックスを作成します。

0100の塗りつぶし係数の値は、すべての点で同じです。

FILLFACTOR の設定は、インデックスが作成または再構築されるときにのみ適用されます。 データベース エンジンでは、ページ内で指定されたパーセント分の空き領域は動的に保持されません。 塗りつぶし係数の設定を表示するには、 sys.indexes カタログ ビューを使用します。

FILLFACTOR100未満のクラスター化インデックスを作成すると、データベース エンジンがクラスター化インデックスの作成時にデータを再配布するため、データが占有するストレージ領域の量に影響します。

詳細については、「 インデックスの FILL FACTOR の指定」を参照してください。

DROP_EXISTING = { ON |OFF }

既存の名前付き空間インデックスを削除して再構築することを指定します。 既定値は OFFです。

  • オン

    既存のインデックスが削除され、再構築されます。 指定するインデックス名は、現在既存のインデックスと同じである必要があります。ただし、インデックス定義は変更できます。 たとえば、さまざまな列、並べ替え順序、パーティション構成、またはインデックス オプションを指定できます。

  • オフ

    指定したインデックス名が既に存在する場合は、エラーが表示されます。

DROP_EXISTINGを使用してインデックスの種類を変更することはできません。

オンライン = オフ

インデックス操作中に、基になるテーブルと関連するインデックスをクエリやデータ変更に使用できないことを指定します。 このバージョンの SQL Server では、オンライン インデックス ビルドは JSON インデックスではサポートされていません。 このオプションを JSON インデックスの ON に設定すると、エラーが発生します。 ONLINE オプションを省略するか、ONLINEOFFに設定します。

JSON インデックスを作成、再構築、または削除するオフライン インデックス操作では、テーブルに対するスキーマ変更 (Sch-M) ロックが取得されます。 このため、操作中は、すべてのユーザーは基になるテーブルにアクセスできません。

オンライン インデックス操作は、SQL Server のすべてのエディションで使用できるわけではありません。

Windows の SQL Server の各エディションでサポートされる機能のリストについては、以下を参照してください。

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 の各エディションでサポートされる機能のリストについては、以下を参照してください。

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);