SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

クエリストアで取得されるロックを確認する

leave a comment

クエリストアにより情報が取得される仕組みについては クエリ処理 で解説が行われています。

基本的な仕組みとしてはこのドキュメントで解説されている次の図となります。

 

クエリ実行実のいくつかのタイミングでクエリストアの情報にアクセスがされるのですが、処理のタイミングによってはクエリストアに対してロックの取得が行われます。

実行されているワークロードによりますが、クエリストアに対して取得されるロックが同時実行性に影響を与え、クエリストアに関係するロックの解析が必要となるケースがあります。

クエリストア関連のロックの確認

クエリストアに関連するロックについても、通常のロックの取得と同様の方法で確認することができます。

sys.dm_os_memory_clerks の説明に記載されていますが、クエリストアは Query Disk Store (QDS) と呼ばれており、取得されるロックについては「QDS」という名称が含まれているケースが多いです。

そのため、拡張イベントでロックの情報を取得する場合は、次のようなイベントを取得することで確認することができます。

CREATE EVENT SESSION [Lock Info] ON SERVER 
ADD EVENT sqlserver.lock_acquired(SET collect_database_name=(1),collect_resource_description=(1)
    ACTION(package0.callstack,sqlserver.client_app_name,sqlserver.session_id,sqlserver.sql_text)
    WHERE ([sqlserver].[like_i_sql_unicode_string]([resource_description],N'%QDS%')))
ADD TARGET package0.event_file(SET filename=N'Lock Info',max_file_size=(100))
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=NO_EVENT_LOSS,MAX_DISPATCH_LATENCY=5 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF)
GO

 

クエリストア関連で取得されるロックについては、「resource_description」に「QDS」が含まれているケースが多いため、それをフィルターとしてロックの情報を取得しています。

実際に情報を取得すると次のような情報を取得することができます。

image

コールスタックを確認することで、どのような処理でクエリストアについてのロックが取得されたのかを確認することができます。

image

冒頭で引用した図では、コンパイルが発生したタイミングでクエリストアへのアクセスが発生していると記載されていますが、コールスタックを確認するとコンパイル後にクエリストア (QDS) の情報のアクセスが行われロックが取得されているということが確認できます。

これらの情報を確認すると、クエリ実行時のどのようなタイミングでクエリストアへのアクセスが発生しているかを把握することができます。

クエリストアを無効にする際には、クエリストアの領域に対して排他ロックの取得が行われることがあります。

これにより通常実行されているクエリについてもクエリストアにアクセスされるタイミングでロック競合が発生し同時実行性の低下が発生するケースがあるので、クエリストアの設定変更がどのようにクエリに影響を与えるかを把握する一助となるのではないでしょうか。

Share

Written by Masayuki.Ozawa

11月 13th, 2023 at 9:12 am

Posted in SQL Server

Tagged with

Leave a Reply