메모리 내 OLTP와 쿼리 저장소 사용Using the Query Store with In-Memory OLTP

이 항목 적용 대상: 예SQL Server예Azure SQL 데이터베이스없습니다Azure SQL 데이터 웨어하우스 없습니다 병렬 데이터 웨어하우스THIS TOPIC APPLIES TO: yesSQL ServeryesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

SQL ServerSQL Server 쿼리 저장소를 사용하면 메모리 내 OLTP에서 실행 중인 작업에 대한 기본 컴파일 코드의 성능을 모니터링할 수 있습니다. Query Store allows you to monitor the performance of natively compiled code for workloads running in-memory OLTP.
컴파일 및 런타임 통계는 디스크 기반 작업과 동일한 방식으로 수집 및 표시됩니다.Compile and runtime statistics are collected and exposed the same way as for disk-based workloads.
메모리 내 OLTP로 마이그레이션하는 경우 디스크 기반 작업용으로 개발한 사용자 지정 스크립트뿐만 아니라 SQL Server Management StudioSQL Server Management Studio 의 쿼리 저장소 보기를 사용하여 진행한 후 마이그레이션할 수 있습니다.When you migrate to in-memory OLTP you can continue using Query Store views in SQL Server Management StudioSQL Server Management Studio as well as custom scripts you have developed for disk-based workloads before migration. 이를 통해 쿼리 저장소 기술에 대한 학습 시간을 단축하고 모든 유형의 작업에 대한 문제를 해결하기 위해 일반적으로 사용할 수 있습니다.This saves your investment in learning Query Store technology and makes it generally usable for troubleshooting all type of workloads.
쿼리 저장소 사용에 대한 일반 정보는 Monitoring Performance By Using the Query Store을(를) 참조하십시오.For general information on using the Query Store, see Monitoring Performance By Using the Query Store.

쿼리 저장소와 메모리 내 OLTP를 사용하기 위해 추가 기능을 구성할 필요가 없습니다.Using the Query Store with in-memory OLTP does not require any additional feature configuration. 데이터베이스에서 활성화되면 모든 유형의 작업에 대해 작동합니다.When you enable it on your database it will work for all types of workloads.
그러나 쿼리 저장소와 메모리 내 OLTP를 사용하는 경우 사용자가 알아야 하는 일부 사항이 있습니다.However, there are some specific aspects that users should be aware of when using Query Store with in-memory OLTP:

  • 쿼리 저장소를 활성화하면 쿼리, 계획 및 컴파일 시간 통계가 기본적으로 수집됩니다.When Query Store is enabled, queries, plans and compile-time statistics are collected by default. 그러나 사용자가 sys.sp_xtp_control_query_exec_stats(Transact-SQL)를 통해 명시적으로 활성화한 경우를 제외하고 런타임 통계 컬렉션은 활성화되지 않습니다.However, runtime statistics collection is not activated unless you explicitly enable it with sys.sp_xtp_control_query_exec_stats (Transact-SQL).

  • @new_collection_value를 0으로 설정한 경우 쿼리 저장소는 영향을 받는 프로시저 또는 전체 SQL ServerSQL Server 인스턴스에 대한 런타임 통계 수집을 중지합니다.When you set @new_collection_value to 0 Query Store will stop collecting runtime statistics for affected procedure or for the entire SQL ServerSQL Server instance.

  • sys.sp_xtp_control_query_exec_stats(Transact-SQL)로 구성된 값은 유지되지 않습니다.The value configured with sys.sp_xtp_control_query_exec_stats (Transact-SQL) is not persisted. SQL ServerSQL Server을(를) 다시 시작한 후에는 통계 컬렉션을 확인 후 다시 구성해야 합니다.Make sure you check and configure again statistics collection after restarting SQL ServerSQL Server.

  • 일반 쿼리 통계 컬렉션에서 사용되는 경우와 같이 작업 실행을 추적하기 위해 쿼리 저장소를 사용하는 경우 성능이 저하될 수 있습니다.As in case with regular query statistics collection, performance may decrease when you use Query Store to track workload execution. 중요한 일부 기본 컴파일 저장 프로시저에 대해서만 통계 컬렉션을 활성화하는 것이 좋습니다.You may want to consider enabling statistics collection only for an important subset of natively compiled stored procedures.

  • 쿼리 및 계획은 첫 번째 기본 컴파일에 캡처 및 저장되고 다시 컴파일될 때마다 업데이트됩니다.Queries and plans are captured and stored on the first native compilation and updated upon every recompilation.

  • 모든 기본 저장 프로시저가 컴파일된 후 쿼리 저장소를 활성화하거나 해당 컨텐츠를 지운 경우 수동으로 다시 컴파일해야 쿼리 저장소에 캡처할 수 있습니다.If you enabled Query Store or cleared its content after all native stored procedure were compiled you must recompile them manually in order to make them captured by the Query Store. sp_query_store_remove_query(Transact-SQL) 또는 sp_query_store_remove_plan(Transct-SQL)을 사용하여 쿼리를 수동으로 제거한 경우에도 이 방식이 적용됩니다.The same applies if you removed queries manually by using sp_query_store_remove_query (Transact-SQL) or sp_query_store_remove_plan (Transct-SQL). sp_recompile(Transact-SQL)을 사용하여 프로시저를 강제로 다시 컴파일합니다.Use sp_recompile (Transact-SQL) to force procedure recompilation.

  • 쿼리 저장소는 메모리 내 OLTP의 계획 생성 메커니즘을 활용하여 컴파일하는 동안 쿼리 실행 계획을 캡처합니다.Query Store leverages plan generation mechanisms from in-memory OLTP to capture query execution plan during the compilation. 저장된 계획은 의미상 SET SHOWPLAN_XML ON 을(를) 사용하여 획득한 것과 같고 한 가지 차이점은 쿼리 저장소의 계획은 개별 문을 기준으로 분할 및 저장된다는 것입니다.Stored plan is semantically equivalent to one that you would get by using SET SHOWPLAN_XML ON with one difference; plans in Query Store are split and stored per individual statement.

  • 혼합 작업이 있는 데이터베이스에서 쿼리 저장소를 실행하는 경우 sys.query_store_plan(Transact-SQL)is_natively_compiled 필드를 사용하여 네이티브 코드 컴파일에서 생성된 쿼리 계획을 쉽게 찾을 수 있습니다.When you run Query Store in a database with a mixed workload then you can use is_natively_compiled field from sys.query_store_plan (Transact-SQL) to quickly find query plans that are generated by the native code compilation.

  • 쿼리 저장소 캡처 모드(ALTER TABLE 문의 QUERY_CAPTURE_MODE 매개 변수)는 구성된 값과 관계없이 항상 캡처되므로 기본적으로 컴파일된 모듈에서 쿼리에 영향을 주지 않습니다.Query Store capture mode (QUERY_CAPTURE_MODE parameter in ALTER TABLE statement) does not affect queries from natively compiled modules as they are always captured regardless of the configured value. 여기에는 QUERY_CAPTURE_MODE = NONE설정이 포함됩니다.This includes setting QUERY_CAPTURE_MODE = NONE.

  • 쿼리 저장소로 캡처된 쿼리 컴파일 기간에는 기본 코드가 생성되기 전 쿼리 최적화에 소요된 시간만 포함됩니다.The duration of query compilation captured by the Query Store includes only time spent in query optimization, before the native code was generated. 보다 정확하게, C 코드 컴파일 시간 및 C 코드를 생성하기 위해 필요한 내부 구조 생성 시간이 포함되지 않습니다.More precisely, it doesn’t include time for C code compilation and generation of internal structures necessary for C code generation.

  • sys.query_store_runtime_stats(Transact-SQL) 내의 메모리 부여 메트릭은 고유하게 컴파일된 쿼리에 대해 채워지지 않습니다. 해당 값은 항상 0입니다.Memory grants metrics within sys.query_store_runtime_stats (Transact-SQL) are not populated for natively compiled queries – their values are always 0. 메모리 부여 열은 avg_query_max_used_memory, last_query_max_used_memory, min_query_max_used_memory, max_query_max_used_memory, 및 stdev_query_max_used_memory입니다.The memory grants columns are: avg_query_max_used_memory, last_query_max_used_memory, min_query_max_used_memory, max_query_max_used_memory, and stdev_query_max_used_memory.

쿼리 저장소와 메모리 내 OLTP 활성화 및 사용Enabling and using Query Store with In-Memory OLTP

다음의 간단한 예제는 종단 간 사용자 시나리오에서 쿼리 저장소와 메모리 내 OLTP를 사용하는 방법을 보여줍니다.The following simple example demonstrates using Query Store with in-memory OLTP in an end-to-end user scenario. 이 예제에서는 메모리 내 OLTP용으로 데이터베이스(MemoryOLTP)가 활성화된 것으로 가정되었습니다.In this example we assume that a database (MemoryOLTP) is enabled for in-memory OLTP.
메모리 최적화 테이블의 필수 구성 요소에 대한 자세한 내용은 메모리 최적화 테이블 및 고유하게 컴파일된 저장 프로시저 만들기를 참조하세요.For more details on prerequisites for memory-optimized tables, see Creating a Memory-Optimized Table and a Natively Compiled Stored Procedure.

USE MemoryOLTP;  
GO  

-- Create a simple memory-optimized table   
CREATE TABLE dbo.Ord  
   (OrdNo INTEGER not null PRIMARY KEY NONCLUSTERED,   
    OrdDate DATETIME not null,   
    CustCode NVARCHAR(5) not null)   
WITH (MEMORY_OPTIMIZED=ON);  
GO  

-- Enable Query Store before native module compilation  
ALTER DATABASE MemoryOLTP SET QUERY_STORE = ON;  
GO  

-- Create natively compiled stored procedure  
CREATE PROCEDURE dbo.OrderInsert(@OrdNo integer, @CustCode nvarchar(5))  
WITH NATIVE_COMPILATION, SCHEMABINDING  
AS   
    BEGIN ATOMIC WITH  
    (TRANSACTION ISOLATION LEVEL = SNAPSHOT,  
    LANGUAGE = N'English')  

    DECLARE @OrdDate DATETIME = GETDATE();  
    INSERT INTO dbo.Ord (OrdNo, CustCode, OrdDate)   
        VALUES (@OrdNo, @CustCode, @OrdDate);  
END;  
GO  

-- Enable runtime stats collection for queries from dbo.OrderInsert stored procedure  
DECLARE @db_id INT = DB_ID()  
DECLARE @proc_id INT = OBJECT_ID('dbo.OrderInsert');  
DECLARE @collection_enabled BIT;  

EXEC [sys].[sp_xtp_control_query_exec_stats] @new_collection_value = 1,   
    @database_id = @db_id, @xtp_object_id = @proc_id;  

-- Check the state of the collection flag  
EXEC sp_xtp_control_query_exec_stats @database_id = @db_id,   
    @xtp_object_id = @proc_id,   
    @old_collection_value= @collection_enabled output;  
SELECT @collection_enabled AS 'collection status';  

-- Execute natively compiled workload  
EXEC dbo.OrderInsert 1, 'A';  
EXEC dbo.OrderInsert 2, 'B';  
EXEC dbo.OrderInsert 3, 'C';  
EXEC dbo.OrderInsert 4, 'D';  
EXEC dbo.OrderInsert 5, 'E';  

-- Check Query Store Data  
-- Compile time data  
SELECT q.query_id, plan_id, object_id, query_hash, p.query_plan,  
    p.initial_compile_start_time, p.last_compile_start_time,   
    p.last_execution_time, p.avg_compile_duration,  
    p.last_force_failure_reason, p.force_failure_count  
FROM sys.query_store_query AS q  
JOIN sys.query_store_plan AS p   
    ON q.query_id = p.plan_id  
WHERE q.object_id = OBJECT_ID('dbo.OrderInsert');  

-- Get runtime stats  
-- Check count_executions field to verify that runtime statistics   
-- have been collected by the Query Store  
SELECT q.query_id, p.plan_id, object_id, rsi.start_time, rsi.end_time,    
    p.last_force_failure_reason, p.force_failure_count, rs.*  
FROM sys.query_store_query AS q  
JOIN sys.query_store_plan AS p   
    ON q.query_id = p.plan_id  
JOIN sys.query_store_runtime_stats AS rs   
    ON rs.plan_id = p.plan_id  
JOIN sys.query_store_runtime_stats_interval AS rsi   
    ON rs.runtime_stats_interval_id = rsi.runtime_stats_interval_id  
WHERE q.object_id = OBJECT_ID('dbo.OrderInsert');  

참고 항목See Also

Monitoring Performance By Using the Query Store Monitoring Performance By Using the Query Store
메모리 액세스에 최적화된 테이블 및 고유하게 컴파일된 저장 프로시저 만들기 Creating a Memory-Optimized Table and a Natively Compiled Stored Procedure
쿼리 저장소에 대한 모범 사례 Best Practice with the Query Store
쿼리 저장소 저장 프로시저(Transact-SQL) Query Store Stored Procedures (Transact-SQL)
쿼리 저장소 카탈로그 뷰(Transact-SQL)Query Store Catalog Views (Transact-SQL)