web-dev-qa-db-ja.com

読み取り可能なセカンダリの強制計画

可用性グループのプライマリでプランが強制されている場合、そのプランはセカンダリで実行されるクエリに適用されますか?

私は計画強制の両方の可能性をカバーする答えを探しています:

QS強制プランは引き継がれないが、ドキュメントやプランガイドに関する信頼できるものを見つけることができないことを示唆する次の記事を読みました。

強制の決定的な証拠は、セカンダリの実行プランにUse PlanまたはPlanGuideNameおよびPlanGuideDBプロパティが存在することです。

14
Paul White 9

クエリストアプランの強制はセカンダリのクエリに影響しません

クエリストアを使用してプランを強制的にプライマリに強制するlooks強制的にセカンダリに強制する。

非製品サーバーでクエリを実行してから、クエリストアをsp_query_store_flush_dbでフラッシュしました(これは、データをセカンダリに同期させるために必要でした)。これが左側のセカンダリ(「読み取り専用」であることに関する丸で囲まれた警告に注意)と右側のプライマリです。

screenshot of query store UI

次に、右側の[Force Plan]をクリックして、両方のビューを更新します。

screenshot of query store UI showing both forced plans

したがって、「強制」は、少なくとも基になるクエリストアテーブルに引き継がれます。これは、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では:

screenshot of execution plan in SSMS showing the "use plan" attribute

セカンダリ(サーバー名が異なることに注意してください)では、計画は強制されていません。これは同じプランのXMLスニペットです。

<QueryPlan DegreeOfParallelism="1" MemoryGrant="11096" CachedPlanSize="288" CompileTime="32" 
           CompileCPU="28" CompileMemory="1656">

screenshot of execution plan in SSMS showing the no "use plan" attribute

プランガイドはセカンダリのクエリに影響しません

私はこのコードを使用してプライマリで計画ガイドを作成しました(テーブル名は無実を保護するために変更されました):

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" ...>

screenshot of execution plan in SSMS showing plan guide attributes

この時点で、計画ガイドがセカンダリに複製されたことを確認しました。

セカンダリで同じクエリを実行すると、実行プランにはプランガイドによって強制される兆候がすべてありません。

<StmtSimple StatementCompId="1" StatementEstRows="1000" ... StatementType="SELECT" 
            QueryHash="0xECF8A24F126EE77A" QueryPlanHash="0x0E93CF7FEAC1B6EA" 
            RetrievedFromCache="true" SecurityPolicyApplied="false">

screenshot of execution plan in XML with missing plan guide attributes

18
Josh Darnell