it-swarm.com.de

Erzwungene Pläne für lesbare Sekundärteile

Wenn ein Plan in einer Verfügbarkeitsgruppe dem Primärplan aufgezwungen wird, wird er auf Abfragen angewendet, die auf einem Sekundärplan ausgeführt werden?

Ich suche nach Antworten, die beide Möglichkeiten für das Erzwingen von Plänen abdecken:

Ich habe Folgendes gelesen, das darauf hindeutet, dass erzwungene QS-Pläne nicht übertragen werden, aber in der Dokumentation oder in Bezug auf Planleitfäden keine maßgeblichen Informationen finden.

Ein schlüssiger Beweis für das Erzwingen wäre das Vorhandensein von Use Plan oder PlanGuideName und PlanGuideDB Eigenschaften im Ausführungsplan des Sekundärs.

14
Paul White 9

Das Erzwingen des Abfragespeicherplans wirkt sich NICHT auf Abfragen auf der Sekundärseite aus

Wenn Sie den Abfragespeicher verwenden, um einen Plan auf der Primärseite zu erzwingen, sieht mit Sicherheit so aus, als würde der Plan auf der Sekundärseite erzwungen.

Ich habe versucht, eine Abfrage auf einem Server ohne Produkt auszuführen und dann den Abfragespeicher mit sp_query_store_flush_db Zu leeren (was erforderlich war, damit die Daten mit dem sekundären synchronisiert werden). Hier ist die Sekundärseite links (beachten Sie die eingekreiste Warnung, dass sie "schreibgeschützt" ist) und die Primärseite rechts:

(screenshot of query store UI

Jetzt klicke ich rechts auf "Plan erzwingen" und aktualisiere dann beide Ansichten:

(screenshot of query store UI showing both forced plans

Das "Forcen" wird also zumindest in den zugrunde liegenden Query Store-Tabellen übertragen. Dies ist sinnvoll, da in den im OP zitierten Artikeln darauf hingewiesen wird, dass das Forcen von Abfragen nach einem Failover bestehen bleiben sollte:

Frage: Wird QDS FORCED Plan-Informationen beim Datenbank-Failover vom primären Replikat zum sekundären Replikat beibehalten?

Antwort: Ja, QDS speichert Forced Plan-Informationen in der Tabelle sys.query_store_plan. Im Falle eines Failovers wird das gleiche Verhalten auf der neuen Primärdatenbank weiterhin angezeigt.

Aber findet das Forcierungsverhalten tatsächlich statt? Ich werde jetzt die gleiche Abfrage auf beiden Servern ausführen. Auf der primären Seite befindet sich erwartungsgemäß das Attribut "UsePlan" im Plan-XML:

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

Und in der Benutzeroberfläche:

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

Auf der Sekundärseite (beachten Sie den unterschiedlichen Servernamen) wurde der Plan nicht erzwungen . Hier ist der gleiche Plan-XML-Ausschnitt:

<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

Plan-Guides wirken sich NICHT auf Abfragen auf der Sekundärseite aus

Mit diesem Code habe ich auf der Primärseite einen Planleitfaden erstellt (Tabellennamen wurden geändert, um die Unschuldigen zu schützen):

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)';

Der Planleitfaden war natürlich auf der Primärseite wirksam, wie aus dem Ausführungsplan hervorgeht:

<StmtSimple StatementCompId="1" StatementEstRows="1000" ... StatementType="SELECT" 
            PlanGuideDB="..._UAT" PlanGuideName="plan-guide-test" ...>

(screenshot of execution plan in SSMS showing plan guide attributes

Ich habe zu diesem Zeitpunkt bestätigt, dass der Planleitfaden auf den sekundären repliziert wurde.

Wenn dieselbe Abfrage auf der sekundären Seite ausgeführt wird, fehlen im Ausführungsplan alle Anzeichen dafür, dass sie von einem Planleitfaden erzwungen werden:

<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