메모리 내 OLTP를 통해 JSON 처리 최적화Optimize JSON processing with in-memory OLTP

이 항목은 다음에 적용됩니다. 예SQL Server(2017부터)예Azure SQL Database아니요Azure SQL Data Warehouse 아니요병렬 데이터 웨어하우스 THIS TOPIC APPLIES TO:yesSQL Server (starting with 2017)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

SQL Server 및 Azure SQL Database를 통해 JSON으로 서식이 지정된 텍스트로 작업할 수 있습니다.SQL Server and Azure SQL Database let you work with text formatted as JSON. JSON 데이터를 처리하는 쿼리의 성능을 향상하려면 표준 문자열 열(NVARCHAR 형식)을 사용하여 메모리 액세스에 최적화된 테이블에 JSON 문서를 저장할 수 있습니다.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

다음 예제에서는 TagsData라는 두 개의 JSON 열이 있는 메모리 액세스에 최적화된 Product 테이블을 보여 줍니다.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 및 Azure SQL Database에서 사용할 수 있는 기능을 통해 기존의 메모리 내 OLTP 기술과 JSON 기능을 완벽하게 통합할 수 있습니다.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:

JSON 열의 유효성 검사 Validate JSON columns

SQL Server 및 Azure SQL Database를 사용하면 문자열 열에 저장된 JSON 문서 내용의 유효성을 검사하는 고유하게 컴파일된 CHECK 제약 조건을 추가할 수 있습니다.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 CHECK 제약 조건을 사용하여 메모리 액세스에 최적화된 테이블에 저장된 JSON 텍스트의 서식이 올바르게 지정되었는지 확인할 수 있습니다.With natively compiled JSON CHECK constraints, you can ensure that JSON text stored in your memory-optimized tables is properly formatted.

다음 예에서는 JSON 열 Tags가 있는 Product 테이블을 만듭니다.The following example creates a Product table with a JSON column Tags. Tags 열에는 ISJSON 함수를 사용하여 열에 있는 JSON 텍스트의 유효성을 검사하는 CHECK 제약 조건이 있습니다.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);

JSON 열이 포함된 기존 테이블에 고유하게 컴파일된 CHECK 제약 조건을 추가할 수도 있습니다.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.

이 예에서 계산 열 MadeInCostData 열에 저장된 JSON 문서가 변경될 때마다 업데이트됩니다.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);

JSON 열의 값 인덱싱 Index values in JSON columns

SQL Server 및 Azure SQL Database를 사용하면 메모리 액세스에 최적화된 인덱스를 사용하여 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 열의 값은 표준 NONCLUSTERED 및 HASH 인덱스를 사용하여 인덱싱할 수 있습니다.Values in JSON columns can be indexed by using both standard NONCLUSTERED and HASH indexes.

  • NONCLUSTERED 인덱스는 일부 JSON 값에 따라 행 범위를 선택하고 JSON 값에 따라 결과를 정렬하는 쿼리를 최적화합니다.NONCLUSTERED indexes optimize queries that select ranges of rows by some JSON value or sort results by JSON values.
  • HASH 인덱스는 찾을 값을 정확히 지정하여 단일 행 또는 몇 개 행을 선택하는 쿼리를 최적화합니다.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 값에는 NONCLUSTERED 인덱스, 다른 값에는 HASH 인덱스를 만듭니다.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 함수를 사용하는 쿼리가 포함되어 있는 경우 네이티브 컴파일은 이러한 쿼리의 성능을 향상하고 쿼리를 실행하는 데 필요한 CPU 주기를 줄입니다.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_VALUE, OPENJSONJSON_MODIFY라는 여러 가지 JSON 함수를 사용하는 고유하게 컴파일된 프로시저를 보여 줍니다.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

SQL Server의 기본 제공 JSON 지원에 대한 자세한 정보Learn more about the built-in JSON support in SQL Server

많은 특정 솔루션, 사용 사례 및 권장 사항은 Microsoft 프로그램 관리자인 Jovan Popovic이 제공하는 SQL Server 및 Azure SQL Database의 기본 제공 JSON 지원에 대한 블로그 게시물을 참조하세요.For lots of specific solutions, use cases, and recommendations, see the blog posts about the built-in JSON support in SQL Server and in Azure SQL Database by Microsoft Program Manager Jovan Popovic.