Оптимизация обработки JSON с помощью выполняющейся в памяти OLTPOptimize JSON processing with in-memory OLTP

Применимо к:Applies to: даSQL ServerSQL Server (все поддерживаемые версии) yesSQL ServerSQL Server (all supported versions) ДаБаза данных SQL AzureAzure SQL DatabaseYesБаза данных SQL AzureAzure SQL DatabaseПрименимо к:Applies to: даSQL ServerSQL Server (все поддерживаемые версии) yesSQL ServerSQL Server (all supported versions) ДаБаза данных SQL AzureAzure SQL DatabaseYesБаза данных SQL AzureAzure SQL Database

База данных SQL Azure и SQL Server позволяют работать с текстами в формате JSON.SQL Server and Azure SQL Database let you work with text formatted as JSON. Чтобы увеличить производительность запросов, которые обрабатывают данные JSON, вы можете хранить документы JSON в таблицах, оптимизированных для памяти, используя стандартные столбцы строкового типа (типа NVARCHAR).To increase the performance of queries that process JSON data, you can store JSON documents in memory-optimized tables using standard string columns (NVARCHAR type). Хранение данных JSON в таблицах, оптимизированных для памяти, повышает производительность запросов за счет доступа к данным в памяти в режиме без блокировки.Storing JSON data in memory-optimized tables increases query performance by leveraging lock-free, in-memory data access.

Хранение документов JSON в таблицах, оптимизированных для памятиStore JSON in memory-optimized tables

В примере ниже показана таблица Product, оптимизированная для памяти, с двумя столбцами JSON — Tags и Data.The following example shows a memory-optimized Product table with two JSON columns, Tags and Data:

CREATE SCHEMA xtp;
GO
CREATE TABLE xtp.Product(
    ProductID int PRIMARY KEY NONCLUSTERED, --standard column
    Name nvarchar(400) NOT NULL, --standard column
    Price float, --standard column

    Tags nvarchar(400),--json stored in string column
    Data nvarchar(4000) --json stored in string column

) WITH (MEMORY_OPTIMIZED=ON);

Оптимизация обработки JSON с помощью дополнительных функций выполнения в памятиOptimize JSON processing with additional in-memory features

Функции, доступные в SQL Server и базе данных SQL Azure, позволяют полностью интегрировать возможности JSON с существующими технологиями выполнения OLTP в памяти.Features that are available in SQL Server and Azure SQL Database let you fully integrate JSON functionality with existing in-memory OLTP technologies. Вы сможете выполнять следующее:For example, you can do the following things:

Проверка столбцов JSONValidate JSON columns

База данных SQL Azure и SQL Server позволяют добавлять скомпилированные в собственном коде ограничения CHECK, проверяющие содержимое документов JSON, которые хранятся в столбце строкового типа.SQL Server and Azure SQL Database let you add natively compiled CHECK constraints that validate the content of JSON documents stored in a string column. Благодаря скомпилированным в собственном коде проверочным ограничениям JSON тексты JSON хранятся в таблицах, оптимизированных для памяти, в правильном формате.With natively compiled JSON CHECK constraints, you can ensure that JSON text stored in your memory-optimized tables is properly formatted.

В следующем примере создается таблица Product с JSON-столбцом Tags.The following example creates a Product table with a JSON column Tags. Столбец Tags имеет ограничение CHECK, которое использует функцию ISJSON для проверки в столбце текста JSON.The Tags column has a CHECK constraint that uses the ISJSON function to validate the JSON text in the column.

DROP TABLE IF EXISTS xtp.Product;
GO
CREATE TABLE xtp.Product(
    ProductID int PRIMARY KEY NONCLUSTERED,
    Name nvarchar(400) NOT NULL,
    Price float,

    Tags nvarchar(400)
            CONSTRAINT [Tags should be formatted as JSON]
                CHECK (ISJSON(Tags)=1),
    Data nvarchar(4000)

) WITH (MEMORY_OPTIMIZED=ON);

Вы можете также добавить скомпилированное в собственном коде ограничение CHECK в существующую таблицу, содержащую столбцы JSON.You can also add the natively compiled CHECK constraint to an existing table that contains JSON columns.

ALTER TABLE xtp.Product
    ADD CONSTRAINT [Data should be JSON]
        CHECK (ISJSON(Data)=1)

Предоставление значений JSON с помощью вычисляемых столбцовExpose JSON values using computed columns

Вычисляемые столбцы позволяют вам предоставлять значения из текста JSON и получать доступ к этим значениям без необходимости повторно получать значения из текста JSON и повторно анализировать структуру JSON.Computed columns let you expose values from JSON text and access those values without fetching the value from the JSON text again and without parsing the JSON structure again. Предоставленные этим способом значения строго типизированы и физически материализуются в вычисляемых столбцах.Values exposted in this way are strongly typed and physically persisted in the computed columns. Доступ к значениям JSON с помощью материализованных вычисляемых столбцов выполняется быстрее, чем прямой доступ к значениям в документе JSON.Accessing JSON values using persisted computed columns is faster than accessing values in the JSON document directly.

В примере ниже показано, как предоставить следующие два значения из столбца JSON Data:The following example shows how to expose the following two values from the JSON Data column:

  • страну, в которой был изготовлен товар;The country where a product is made.
  • себестоимость производства товара.The product manufacturing cost.

В этом примере вычисляемые столбцы MadeIn и Cost обновляются каждый раз, когда изменяется документ JSON, сохраненный в столбце Data.In this example, the computed columns MadeIn and Cost are updated every time the JSON document stored in the Data column changes.

DROP TABLE IF EXISTS xtp.Product;
GO
CREATE TABLE xtp.Product(
    ProductID int PRIMARY KEY NONCLUSTERED,
    Name nvarchar(400) NOT NULL,
    Price float,

    Data nvarchar(4000),

    MadeIn AS CAST(JSON_VALUE(Data, '$.MadeIn') as NVARCHAR(50)) PERSISTED,
    Cost   AS CAST(JSON_VALUE(Data, '$.ManufacturingCost') as float)

) WITH (MEMORY_OPTIMIZED=ON);

Индексирование значений в столбцах JSONIndex values in JSON columns

База данных SQL Azure и SQL Server позволяют индексировать значения в столбцах JSON с помощью оптимизированных для памяти индексов.SQL Server and Azure SQL Database let you index values in JSON columns by using memory-optimized indexes. Индексируемые значения JSON должны быть строго типизированными и предоставленными с помощью вычисляемых столбцов, как описано в предыдущем примере.JSON values that are indexed must be exposed and strongly typed by using computed columns, as described in the preceding example.

Значения в столбцах JSON можно индексировать с помощью двух стандартных индексов — некластеризованного и хэш-индекса.Values in JSON columns can be indexed by using both standard NONCLUSTERED and HASH indexes.

  • Некластеризованные индексы оптимизируют запросы, которые выбирают диапазоны строк по какому-либо значению JSON или сортируют результаты по значениям JSON.NONCLUSTERED indexes optimize queries that select ranges of rows by some JSON value or sort results by JSON values.
  • Хэш-индексы оптимизируют запросы, которые выбирают одну или несколько записей, указывая точное значение для поиска.HASH indexes optimize queries that select a single row or a few rows by specifying an exact value to find.

В следующем примере создается таблица, которая предоставляет значения JSON с помощью двух вычисляемых столбцов.The following example builds a table that exposes JSON values by using two computed columns. В примере создается некластеризованный индекс в одном значении JSON и хэш-индекс — в другом.The example creates a NONCLUSTERED index on one JSON value and a HASH index on the other.

DROP TABLE IF EXISTS xtp.Product;
GO
CREATE TABLE xtp.Product(
    ProductID int PRIMARY KEY NONCLUSTERED,
    Name nvarchar(400) NOT NULL,
    Price float,

    Data nvarchar(4000),

    MadeIn AS CAST(JSON_VALUE(Data, '$.MadeIn') as NVARCHAR(50)) PERSISTED,
    Cost   AS CAST(JSON_VALUE(Data, '$.ManufacturingCost') as float) PERSISTED,

    INDEX [idx_Product_MadeIn] NONCLUSTERED (MadeIn)

) WITH (MEMORY_OPTIMIZED=ON)

ALTER TABLE Product
    ADD INDEX [idx_Product_Cost] NONCLUSTERED HASH(Cost)
        WITH (BUCKET_COUNT=20000)

Компиляция запросов JSON в собственном кодеNative compilation of JSON queries

Если процедуры, функции и триггеры содержат запросы, которые используют встроенные функции JSON, компиляция в машинный код повышает производительность этих запросов и снижает количество циклов ЦП, необходимых для их выполнения.If your procedures, functions, and triggers contain queries that use the built-in JSON functions, native compilation increases the performance of these queries and reduces the CPU cycles required to run them.

В примере ниже показана скомпилированная в собственном коде процедура, использующая несколько функций JSON: JSON_VALUE, OPENJSON и JSON_MODIFY.The following example shows a natively compiled procedure that uses several JSON functions - JSON_VALUE, OPENJSON, and JSON_MODIFY.

CREATE PROCEDURE xtp.ProductList(@ProductIds nvarchar(100))
WITH SCHEMABINDING, NATIVE_COMPILATION
AS BEGIN
    ATOMIC WITH (transaction isolation level = snapshot,  language = N'English')

    SELECT ProductID,Name,Price,Data,Tags, JSON_VALUE(data,'$.MadeIn') AS MadeIn
    FROM xtp.Product
        JOIN OPENJSON(@ProductIds)
            ON ProductID = value
END;

CREATE PROCEDURE xtp.UpdateProductData(@ProductId int, @Property nvarchar(100), @Value nvarchar(100))
WITH SCHEMABINDING, NATIVE_COMPILATION
AS BEGIN
    ATOMIC WITH (transaction isolation level = snapshot,  language = N'English')

    UPDATE xtp.Product
    SET Data = JSON_MODIFY(Data, @Property, @Value)
    WHERE ProductID = @ProductId;
END

Дополнительные сведения о JSON в SQL Server и базе данных SQL AzureLearn more about JSON in SQL Server and Azure SQL Database

Видео МайкрософтMicrosoft videos

Наглядные инструкции по встроенной поддержке JSON в SQL Server и базе данных SQL Azure см. в следующих видео.For a visual introduction to the built-in JSON support in SQL Server and Azure SQL Database, see the following videos: