先日、SQL Database のセカンダリ レプリカのクエリストアについて という投稿をしました。
セカンダリ レプリカのクエリストアヒントについては、SQL Server 2025 でもサポートされているため、分散型可用性グループを構築して、SQL Server でも挙動をを確認してみました。
分散型可用性グループのリスナーでアクセス可能な環境
分散型可用性グループのクエリストアで取得可能な情報を把握する際には、最初に、次のドキュメントを確認しておくとよいかと思います。
このドキュメントは、分散型可用性グループの環境に対して、可用性グループのリスナー経由で接続する際のレプリカについて記載されたものとなりますが、ポイントとなるのが次の内容です。
読み取り専用ルーティングは、分散型可用性グループでは正しく動作しません。 具体的には次のとおりです。
- 読み取り専用ルーティングを構成することができ、分散型可用性グループのプライマリ可用性グループに対して動作します。
- 読み取り専用ルーティングを構成できますが、分散型可用性グループのセカンダリ可用性グループには動作しません。 すべてのクエリがリスナーを使ってセカンダリ可用性グループに接続する場合は、セカンダリ可用性グループのプライマリ レプリカに移動します。 それ以外の場合は、各レプリカがすべての接続をセカンダリ レプリカとして許可し、それらに直接アクセスするように、構成する必要があります。 ただし、フェールオーバー後に、セカンダリ可用性グループがプライマリになっている場合は、読み取り専用ルーティングは動作します。 この動作は、SQL Server 2016 の更新プログラムまたは SQL Server の将来のバージョンで、変更される可能性があります。
分散型可用性グループのプライマリ可用性グループについては、リスナー経由の接続は期待した動作となり、プライマリレプリカ / セカンダリレプリカの両環境に接続することが可能です。
しかし、分散型可用性グループのセカンダリ可用性グループに対してリスナー経由でアクセスできる環境には、制約があります。
本投稿作成時点 (SQL Server 2025 CU6) セカンダリ可用性グループでは読み取り専用ルーティングは動作せず、「ApplicationIntent=ReadOnly」を設定して、リスナーを経由してセカンダリ可用性グループに対してアクセスを行っても、フォワーダーとして動作するプライマリレプリカに接続されるという挙動となります。
そのため、分散型可用性グループに対して、リスナー経由で接続する場合、クエリストアで取得可能な情報は次の 3 環境となります。
- プライマリ可用性グループのプライマリレプリカ
- プライマリ可用性グループのセカンダリレプリカ
- セカンダリ可用性グループのプライマリレプリカ
「セカンダリ可用性グループのセカンダリレプリカ」については、リスナー経由でアクセスすることはできず、サーバーを直接指定することでアクセスを行うことになります。
分散型可用性グループのクエリストアと replica_group_id
クエリストアで取得可能なレプリカについては sys.query_store_replicas で確認することができます。
分散型可用性グループで認識されるレプリカは 1~3 までとなり、4 の「Geo HA Secondary」として取得される情報存在しないようです。
実際にクエリストアで取得可能なレプリカの情報が上記の画像の内容となります。
各レプリカでクエリを実行したところ、replica_group_id は次のようになっているようでした。
- Primary
- プライマリ可用性グループのプライマリレプリカ
- Secondary
- プライマリ可用性グループのセカンダリレプリカ
- セカンダリ可用性グループのセカンダリレプリカ
- セカンダリ可用性グループのセカンダリレプリカはリスナー経由で接続できないため直接接続
- Geo Secondary
- セカンダリ可用性グループのプライマリレプリカ
各レプリカのクエリ情報をクエリストアで取得することができますが、セカンダリ可用性グループのセカンダリレプリカについては、「2. Secondary」として取得されているのがポイントでしょうか。
各レプリカのクエリストアですが、最終的にプライマリレプリカでフラッシュさせるためには、時間経過か各レプリカで、 sp_query_store_flush_db を実行することで対応することができます。
検証でプライマリレプリカにクエリストアの情報を反映させたい場合には、クエリストアをフラッシュしたいレプリカに接続した状態で、このストアドプロシージャを実行するとよいかと。
セカンダリレプリカのクエリストアヒント
SQL Server 2025 のクエリストアでもクエリストアヒントがサポートされています。
今回、私が構築した環境では、次の 3 環境については設定することができました。
- プライマリ可用性グループのプライマリレプリカ
- プライマリ可用性グループのセカンダリレプリカ
- セカンダリ可用性グループのプライマリレプリカ
「セカンダリ可用性グループのセカンダリレプリカ」については、クエリストアヒントを適用させることができませんでした。
この環境で実行されたクエリは、「replica_group_id=2」のクエリとして、クエリストアでは認識されているのですが、この設定でクエリストアヒントを設定しても適用させることができませんでした。
他のレプリカでは設定ができているので、根本的な設定方法が間違っているということもなさそうではあるのですが、セカンダリ可用性グループのセカンダリレプリカに対してのクエリストアヒントの適用については、もう少し調査をしてみたいと思います。