SE の雑記

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

クエリストアの検証のためクエリストアをエラー状態にする方法

leave a comment

クエリストアの状態については sys.database_query_store_options で情報が公開されています。

操作モードの中には「ERROR」という状態があり、ERROR を解消するためには「sp_query_store_consistency_check」を実行する必要があります。

このストアドプロシージャの動作確認を実状態と合わせて行う場合には、クエリストアの状態を ERROR にする必要があります。

イレギュラーな操作となりますが、クエリストアを意図的に ERROR にすることは可能ですので、操作方法を残しておきたいと思います。

ERROR 状態を再現する方法

クエリストアは「sys.plan_persist~」というテーブルが実体となっており「sys.query_store~」はビューとなっており実情報を間接的に参照しています。

通常「sys.plan_persist~」というテーブルは操作することができないのですが、DAC を使用すると操作することができ、これによりクエリストア内の情報にデータ矛盾を発生させ、ERROR の状態を意図的に再現させることができます。

実際の操作例としては次のようなクエリとなります。
(クエリストアですべてのクエリの情報取得が有効になった、空のデータベースでの操作を想定したものとなります)

最初にクエリストアを破損させるデータベースで次のようなクエリを実行します。

USE CrashTest
GO

DROP TABLE IF EXISTS T1
GO
create table T1(C1 int)
GO
INSERT INTO T1 VALUES(100)
GO 10

 

これでクエリストアの情報が生成された状態となりますので、次に DAC で接続をしたセッションで次のクエリを実行して、クエリストアの情報を一部削除します。通常のセッションでは操作できませんが、DAC で接続することでクエリストアの実データを操作することができます。

USE CrashTest
GO
delete from sys.plan_persist_query_text 
delete from sys.plan_persist_plan
GO

 

次に最初に実行したセッション (通常のユーザーセッション) で次のクエリを実行すると、クエリストアが破損した状態とすることができます。

INSERT INTO T1 VALUES(100)
GO

EXEC sp_query_store_flush_db
GO

 

image

この状態にすることで、「sp_query_store_consistency_check」による整合性の修正でどのような挙動が行われるか九人できるかと思います。

今回はデータ不整合を発生させるために一部のテーブルの全件削除を実施していますが、データの論理的な矛盾を再現できれば良いはずですので、特定のレコードの削除でも事象を再現させることはできるかと。

Share

Written by Masayuki.Ozawa

12月 25th, 2023 at 9:54 am

Posted in SQL Server

Tagged with

Leave a Reply