適用対象:適用対象: SQL Server 2025 (17.x) プレビュー
Azure SQL Database
Sql データベース (Microsoft Fabric プレビュー)
読み取り可能なセカンダリのクエリ ストア は SQL Server 2022 (16.x) で導入され、読み取り可能なセカンダリ機能の永続化された統計では、読み取り可能なセカンダリに対してクエリ ストアが用意されているインフラストラクチャが使用されます。 読み取り可能なセカンダリのクエリ ストアは、SQL Server 2025 (17.x) プレビューでは既定で オン になっていますが、SQL Server 2022 (16.x) では オフ であり、有効にするにはトレース フラグ 12606 が必要でした。
トレース フラグ 12606 は SQL Server 2025 (17.x) Preview 以降のバージョンでは必要 ありません 。使用すると、読み取り可能なセカンダリ機能のクエリ ストアが オフになります。
Background
読み取り可能なセカンダリ レプリカでは、 統計の自動作成 オプションが有効になっているときに統計を自動的に作成することもできますが、これらの統計は一時的であり、インスタンスが再起動されると消えます。 読み取り専用データベースまたは読み取り専用スナップショットの統計が見つからないか古い場合、データベース エンジンは tempdbで一時的な統計を作成し、保持します。
データベース エンジンが一時的な統計を作成すると、統計名にサフィックス _readonly_database_statistic が付加され、一時統計と永続的な統計が区別されます。 サフィックス _readonly_database_statistic は、SQL Server によって生成された統計用に予約されています。 このアプローチが採用された理由は、プライマリ レプリカに存在しない個別の統計が必要になる可能性がある読み取り可能なセカンダリ レプリカに対して実行されるワークロードに対処するためです。
セカンダリ レプリカで作成された一時的な統計は、生成されたレプリカにのみ表示されます。 プライマリ レプリカは、これらの一時的な統計オブジェクトに直接アクセスすることはなく、永続化後の永続的な統計オブジェクトのみを認識します。 プライマリ レプリカに一時的な統計が永続化されると、同期メカニズムを通じて可用性グループ内のすべてのレプリカで使用できるようになります。 永続化メカニズムでは、SQL Server 2022 (16.x) で導入された読み取り可能なセカンダリ インフラストラクチャにクエリ ストアを使用します。 統計情報はプライマリ レプリカに送信され、そこで永続的な統計として保持された後、すべてのセカンダリ レプリカに同期されます。 このプロセスは、手動による介入を必要とせずに自動的に行われます。
サポートされているカタログの表示
セカンダリとプライマリの間での統計の作成または更新の比較をサポートし、統計が作成された場所を理解するために、 sys.stats カタログ ビューに次の 3 つの新しい列が追加されました。
| 列名 | データ型 | Description |
|---|---|---|
replica_role_id |
tinyint |
1 = プライマリ、 2 = セカンダリ、 3 = Geo セカンダリ、 4 = Geo HA セカンダリ |
replica_role_desc |
nvarchar(60) | プライマリ、セカンダリ、ジオ セカンダリ、ジオ HA セカンダリ |
replica_name |
sysname | 可用性グループ内のレプリカのインスタンス名。
NULL プライマリ レプリカの場合 |
これらの列は、永続化ライフサイクル全体を通じて統計の所有権と配信元を追跡します。 セカンダリ レプリカが一時的な統計を作成し、プライマリに永続化すると、replica_role_id列とreplica_name列によって、元のレプリカが識別されます。 これらの永続的な統計が後でプライマリ レプリカで更新された場合、所有権はプライマリに転送され、これらの列に反映されます。
統計の永続化の動作
セカンダリ レプリカからプライマリに一時的な統計が永続化されると、いくつかの重要な動作が発生します。セカンダリ レプリカの一時統計は永続化後に自動的に削除されません。 最初にこれらの一時的な統計の作成をトリガーしたクエリは、クエリが再コンパイルされるかレプリカが再起動されるまで、それらを引き続き使用します。 これは、同じ統計の一時的なバージョンと永続的なバージョンの両方が一時的に共存できることを意味します。
オプティマイザーでは、統計を使用するかどうかを決定するときにレプリカの所有権は考慮されません。 列カバレッジと選択度の推定に基づいて、使用可能なすべての統計情報が評価されます。 レプリカ情報は、主に追跡とトラブルシューティングの目的で維持されます。
注目すべきシナリオは、一時的な統計から作成された永続的な統計が古くなった場合に発生します。 これらの統計の主な影響を受ける列で重要なデータ変更が発生した場合、永続的な統計は古いと見なされる可能性があります。 セカンダリ レプリカのクエリがこれらの列を参照すると、セカンダリはデータのビューに基づいて統計を更新し、再実行プロセスによって適用された変更を反映します。
つまり、永続化では、古い統計を更新するセカンダリの機能は削除されません。レプリカ間で統計を 共有 するメカニズムを追加するだけです。
Observability
拡張イベント
persisted_stats_operation(運用チャネル)はenqueued、dequeued、processedおよびfailedのイベントに対して提起されます。 これは、統計メッセージをプライマリに保持できないか、またはメッセージ処理機能の監視に関心があるかどうかを監視するのに役立ちます。 一時的な統計情報はセカンダリ レプリカの tempdb に残りますが、プライマリ レプリカとセカンダリ レプリカの間に通信の問題がある場合、バックグラウンド プロセスはメッセージの送信を再試行します。
ERRORLOG に記録できる関連エラー メッセージの例
- 9131: SQL の起動時に機能が無効になりました。
- 9136: テーブルまたはインデックスの削除/変更。
- 9137: スナップショット トランザクションの開始後にスキーマが変更されました。リトライ。
- 9139: 統計が大きすぎてプライマリに送信できません。
次のクエリでは、セカンダリ レプリカから永続化された統計を含め、テーブルの統計をある程度可視化できます。
SELECT sch.[name] AS SchemaName,
obj.[name] AS TableName,
s.[name] AS StatsName,
CASE WHEN s.stats_id >= 2 AND s.auto_created = 1 THEN 'AUTO_STATS'
WHEN s.stats_id >= 2 AND s.auto_created = 0 THEN 'USER_CREATED_STATS'
ELSE 'INDEX_STATS'
END AS type,
s.is_temporary,
CASE WHEN s.replica_name IS NULL
AND s.replica_role_desc = 'PRIMARY'
AND s.stats_id >= 2
AND s.auto_created = 1 THEN 'PRIMARY' ELSE s.replica_name
END AS replica_name,
s.replica_role_id,
s.replica_role_desc
FROM sys.schemas AS sch
INNER JOIN sys.objects AS obj
ON sch.schema_id = obj.schema_id
INNER JOIN sys.stats AS s
ON obj.object_id = s.object_id
WHERE sch.[name] <> 'sys'
ORDER BY sch.[name], obj.[name], s.stats_id;
考慮事項
読み取り可能なセカンダリ機能の永続化された統計は、 自動作成統計 オプションが有効になっていて、既定の構成である READABLE_SECONDARY_TEMPORARY_STATS_AUTO_CREATE と READABLE_SECONDARY_TEMPORARY_STATS_AUTO_UPDATE データベース スコープの構成オプションが有効になっている限り、既定で有効になります。 機能のオンとオフを切り替えるデータベース スコープの構成はありません。