Поиск…


JSON хранится в виде текстового столбца

JSON - текстовый формат, поэтому он хранится в стандартных столбцах NVARCHAR. Коллекция NoSQL эквивалентна таблице с двумя значениями столбцов:

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

Используйте nvarchar(max) как вы не уверены, каков размер ваших документов JSON. nvarchar(4000) и varchar(8000) имеют лучшую производительность, но с ограничением по размеру до 8 КБ.

Убедитесь, что JSON правильно отформатирован с использованием ISJSON

Поскольку JSON хранит текстовый столбец, вы можете убедиться, что он правильно отформатирован. Вы можете добавить ограничение CHECK в столбец JSON, который проверяет, правильно ли форматируется текст 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:

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»)) и создайте индекс в этом столбце:

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