Microsoft SQL Server
Хранение JSON в таблицах SQL
Поиск…
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 нет замков и защелок