サーチ…


JSONはテキスト列として保存されます

JSONはテキスト形式なので、標準NVARCHAR列に格納されます。 NoSQLコレクションは、2つの列のキー値テーブルと同等です。

CREATE TABLE ProductCollection (
  Id int identity primary key,
  Data nvarchar(max)
)

JSONドキュメントのサイズがわからない場合は、 nvarchar(max)を使用してください。 nvarchar(4000)およびvarchar(8000)パフォーマンスは向上しますが、サイズの制限は8KBです。

ISONを使用してJSONが適切にフォーマットされていることを確認する

JSONはテキスト列に格納されているので、適切に書式設定されていることを確認してください。 JSON列にCHECK制約を追加すると、テキストが正しく書式設定されているかどうかチェックできます。JSON:

CREATE TABLE ProductCollection (
  Id int identity primary key,
  Data nvarchar(max)
       CONSTRAINT [Data should be formatted as JSON]
       CHECK (ISJSON(Data) > 0)
)

すでにテーブルがある場合は、ALTER TABLEステートメントを使用してCHECK制約を追加できます。

ALTER TABLE ProductCollection
    ADD CONSTRAINT [Data should be formatted as JSON]
        CHECK (ISJSON(Data) > 0)

JSONテキストの値を計算カラムとして公開する

JSON列の値を計算列として公開することができます。

CREATE TABLE ProductCollection (
  Id int identity primary key,
  Data nvarchar(max),
  Price AS JSON_VALUE(Data, '$.Price'),
  Color JSON_VALUE(Data, '$.Color') PERSISTED
)

PERSISTED計算カラムを追加すると、JSONテキストの値がこの列にマテリアライズされます。このようにして、構文解析が不要なため、クエリでJSONテキストの値をより高速に読み取ることができます。この行のJSONが変更されるたびに、値が再計算されます。

JSONパスにインデックスを追加する

JSON列のデータをフィルタリングまたはソートするクエリでは、通常、フルテーブルスキャンが使用されます。

SELECT * FROM ProductCollection
WHERE JSON_VALUE(Data, '$.Color') = 'Black'

これらの種類のクエリを最適化するには、フィルタまたはソートで使用されるJSON式(この例ではJSON_VALUE(Data、 '$ .Color'))を公開する非永続計算列を追加し、この列にindexを作成します。

ALTER TABLE ProductCollection
ADD vColor as JSON_VALUE(Data, '$.Color')

CREATE INDEX idx_JsonColor
ON ProductCollection(vColor)

クエリでは、プレーン・テーブル・スキャンではなくインデックスを使用します。

メモリ内のテーブルに保存されたJSON

メモリ最適化テーブルを使用できる場合は、JSONをテキストとして保存できます。

CREATE TABLE ProductCollection (
  Id int identity primary key nonclustered,
  Data nvarchar(max)
) WITH (MEMORY_OPTIMIZED=ON)

インメモリーのJSONの利点:

  • JSONデータは常にメモリに保存されているため、ディスクにアクセスすることはできません。
  • JSONの操作中にロックやラッチがありません


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow