インメモリ OLTP でのクエリ ストアの使用Using the Query Store with In-Memory OLTP

適用対象: yesSQL Server yesAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database noAzure Synapse Analytics (SQL DW) 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
メモリ最適化テーブルおよびネイティブ コンパイル ストアド プロシージャの作成 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)