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


14

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

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

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

強制の決定的な証拠は存在だろうUse Planか、PlanGuideNamePlanGuideDBの二次実行計画のプロパティ。

回答:


18

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

クエリストアを使用してプライマリで計画を強制すると、確かにセカンダリで計画を強制するように見えます。

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

クエリストアUIのスクリーンショット

次に、右側の[プランの強制]をクリックして、両方のビューを更新します。

両方の強制プランを示すクエリストアUIのスクリーンショット

したがって、「強制」は、少なくとも基礎となるクエリストアテーブルで引き継がれます。これは、OPで引用されている記事が、フェールオーバー後もクエリの強制を所定の位置に維持する必要があることを示しているため、理にかなっています。

質問:データベースがプライマリレプリカからセカンダリレプリカにフェールオーバーすると、QDSはFORCEDプラン情報を保持しますか?

回答:はい。QDSは強制プラン情報をsys.query_store_planテーブルに保存するため、フェールオーバーの場合、新しいプライマリで同じ動作が引き続き発生します。

しかし、強制動作は実際に行われますか?ここで、両方のサーバーで同じクエリを実行します。プライマリでは、予想どおり、プランXMLに「UsePlan」属性があります。

<QueryPlan DegreeOfParallelism="1" MemoryGrant="11096" CachedPlanSize="288" CompileTime="82"
           CompileCPU="78" CompileMemory="2104" UsePlan="true">

そしてUIで:

「使用計画」属性を示すSSMSの実行計画のスクリーンショット

セカンダリ(異なるサーバー名に注意)では、計画は強制されませんでした。同じプランのXMLスニペットを次に示します。

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

「使用計画」属性がないことを示すSSMSの実行計画のスクリーンショット

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

次のコードを使用してプライマリでプランガイドを作成しました(無実を保護するためにテーブル名を変更しました)。

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

プランガイドの属性を示すSSMSの実行計画のスクリーンショット

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

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

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

プランガイド属性が欠落しているXMLの実行プランのスクリーンショット

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.