SE の雑記

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

SQL Server 2022 New Features: セカンダリレプリカのクエリストア

leave a comment

SQL Server 2022 CTP 2.0 時点の情報となり、今後の Preview / 一般提供開始時には変更されている可能性もあります。

SQL Server 2022 では Always On 可用性グループの機能強化として、「セカンダリレプリカのクエリストア」があります。

Always On 可用性グループとクエリストアを組み合わせることは、以前から可能でしたが、クエリストアで取得可能なクエリ情報は「書き込み可能なプライマリレプリカに対して実行されたクエリ」のみとなっていました。

そのため、「セカンダリレプリカに対して実行された読み取りワークロード用のクエリ」については、クエリストアに情報が蓄積されず、セカンダリレプリカで実行されているクエリについては、クエリキャッシュをベースとした解析を行う必要がありました。(これは、SQL Server だけでなく、PaaS の SQL Server ベースの環境でも同様の動作となっています)

SQL Server 2022 では、この点が改善され、セカンダリレプリカに対して実行されたクエリについてもクエリストアに情報を格納できるようになりました。

セカンダリレプリカのクエリストアの有効化方法

セカンダリレプリカのクエリストアの有効化方法については、セカンダリ レプリカのクエリ ストアを有効にする に記載されている内容で有効にすることができます。

CTP 2.0 時点では、記載されているトレースフラグを設定する必要があり、トレースフラグを設定している環境であれば、クエリストアが有効になっているデータベースに対して、プライマリで次のクエリを実行することでセカンダリレプリカのクエリストアを有効にすることができます。

ALTER DATABASE CURRENT  
FOR SECONDARY SET QUERY_STORE = ON ( 
        OPERATION_MODE = READ_WRITE 
);
GO

 

有効化後、セカンダリレプリカで設定の確認用クエリを実行し、「readonly_reason=8」となっていれば、セカンダリレプリカのクエリストアが有効になっています。

image

 

セカンダリレプリカのクエリストアの仕組み

セカンダリレプリカのクエリストアの仕組みについては、セカンダリ レプリカのクエリ ストア に記載されています。

セカンダリ レプリカのクエリ ストアが有効になっている場合、レプリカにより、通常はクエリ ストアに格納されるクエリ実行情報がプライマリ レプリカに送信されます。 その後、プライマリ レプリカにより、独自のクエリ ストア内のディスクにデータが保持されます。 本質的には、プライマリおよびすべてのセカンダリ レプリカの間で共有されるクエリ ストアは 1 つです。 クエリ ストアはプライマリ レプリカに存在し、すべてのレプリカのデータが一緒に格納されます。

セカンダリレプリカでクエリストアが有効になっている場合、実行されたクエリの情報はセカンダリレプリカ内のキューに格納されます。

この時、セカンダリのクエリストアでは、query_id / plan_id がマイナスの値として登録されているようです。(マイナスになっているクエリ情報については、セカンダリでのみ存在しており、プライマリの送信されていないデータとなるようです)

image

このクエリストアの情報は、非同期でプライマリに送信され、通常のクエリストアのデータとして登録が行われます。image

プライマリに登録されたセカンダリのクエリストアについては、キューから削除され、再度プライマリからクエリストアの情報が連携されるという形になります。

流れとしては次のようになるかと。

  1. セカンダリで実行されたクエリストアの情報は、キューに登録される
  2. キューに登録されたデータは、非同期でプライマリに送信される
  3. プライマリに送信されたクエリ情報は、クエリストア内に永続化される
  4. 永続化されたクエリストアの情報がセカンダリに送信される

動作の詳細については、セカンダリレプリカでクエリストア用の拡張イベントを有効にしておくことで確認ができると思います。

image

最終的には、 sys.query_store_runtime_stats もプライマリに送信されるのですが、この情報については、他の情報と比較して、フラッシュされるのが遅いようで、実行統計の情報については、永続化されるまで時間がかかるようです。

プライマリとセカンダリのどちらで実行されたかについては、sys.query_store_runtime_stats の replica_group_id で確認ができるようです。(CTP 2.0 時点では情報が確認できなかったのですが、sys.query_store_replicas というシステムビューも追加されているようなので、replica_group_id のマスタについては、このシステムビューから確認できるかもしれませんね)

プライマリに送信されたクエリの情報については、通常のクエリストアと同じように情報を確認することができます。

 

セカンダリのクエリストアを有効にすることで、従来までのキャッシュベースのクエリ情報の確認と比較して、クエリの分析の容易性が向上します。

この機能、便利なので SQL Database でも早く来てもらいたいですね。。。

Share

Written by Masayuki.Ozawa

7月 4th, 2022 at 11:07 pm

Leave a Reply