可用性グループのプライマリでプランが強制されている場合、そのプランはセカンダリで実行されるクエリに適用されますか?
私は計画強制の両方の可能性をカバーする答えを探しています:
QS強制プランは引き継がれないが、ドキュメントやプランガイドに関する信頼できるものを見つけることができないことを示唆する次の記事を読みました。
強制の決定的な証拠は、セカンダリの実行プランにUse Plan
またはPlanGuideName
およびPlanGuideDB
プロパティが存在することです。
クエリストアを使用してプランを強制的にプライマリに強制するlooks強制的にセカンダリに強制する。
非製品サーバーでクエリを実行してから、クエリストアをsp_query_store_flush_db
でフラッシュしました(これは、データをセカンダリに同期させるために必要でした)。これが左側のセカンダリ(「読み取り専用」であることに関する丸で囲まれた警告に注意)と右側のプライマリです。
次に、右側の[Force Plan]をクリックして、両方のビューを更新します。
したがって、「強制」は、少なくとも基になるクエリストアテーブルに引き継がれます。これは、OPで引用された記事がフェールオーバー後もクエリの強制を適切な場所に維持する必要があるという点を踏まえると、理にかなっています。
質問:QDSは、プライマリレプリカからセカンダリレプリカへのデータベースのフェイルオーバー時に強制プラン情報を保持しますか?
回答:はい。QDSは強制計画情報をsys.query_store_planテーブルに保存するため、フェイルオーバーが発生した場合でも、新しいプライマリで同じ動作が継続して見られます。
しかし、強制動作は実際に行われますか?次に、両方のサーバーで同じクエリを実行します。プライマリでは、予想どおり、 "UsePlan"属性がプランXMLにあります。
<QueryPlan DegreeOfParallelism="1" MemoryGrant="11096" CachedPlanSize="288" CompileTime="82"
CompileCPU="78" CompileMemory="2104" UsePlan="true">
そしてUIでは:
セカンダリ(サーバー名が異なることに注意してください)では、計画は強制されていません。これは同じプランのXMLスニペットです。
<QueryPlan DegreeOfParallelism="1" MemoryGrant="11096" CachedPlanSize="288" CompileTime="32"
CompileCPU="28" CompileMemory="1656">
私はこのコードを使用してプライマリで計画ガイドを作成しました(テーブル名は無実を保護するために変更されました):
EXEC sp_create_plan_guide
@name = 'plan-guide-test',
@stmt = N'SELECT TOP (1000) *
FROM dbo.TableName t
WHERE
NOT EXISTS
(
SELECT NULL
FROM dbo.OtherTable o
WHERE t.Id = o.TableName
);',
@type = N'SQL',
@module_or_batch = NULL,
@hints = N'OPTION (MAXDOP 1)';
もちろん、実行ガイドで証明されているように、プランガイドはプライマリで効果的でした。
<StmtSimple StatementCompId="1" StatementEstRows="1000" ... StatementType="SELECT"
PlanGuideDB="..._UAT" PlanGuideName="plan-guide-test" ...>
この時点で、計画ガイドがセカンダリに複製されたことを確認しました。
セカンダリで同じクエリを実行すると、実行プランにはプランガイドによって強制される兆候がすべてありません。
<StmtSimple StatementCompId="1" StatementEstRows="1000" ... StatementType="SELECT"
QueryHash="0xECF8A24F126EE77A" QueryPlanHash="0x0E93CF7FEAC1B6EA"
RetrievedFromCache="true" SecurityPolicyApplied="false">