Fehlende Ausführungspläne für gespeicherte Prozeduren

12

Was sind die Gründe dafür, dass ein Plan für gespeicherte Prozeduren im Cache fehlt?

  1. WITH RECOMPILE
  2. Dynamisches SQL
  3. Verschlüsselter Code
  4. Signifikante Datenänderungen
  5. Statistiken aktualisieren
  6. Was sonst?

Ich habe vor kurzem auf 2 Servern (SQL Server 2008 R2 und SQL Server 2012) gearbeitet, die keine Pläne für sehr ressourcenintensive gespeicherte Prozeduren im Cache hatten. Viele, vielleicht alle Anweisungen in den gespeicherten Prozeduren hatten auch keine Pläne im Cache. Einige der gespeicherten Prozeduren werden ziemlich häufig ausgeführt, beispielsweise einige Male pro Sekunde.

Kein Speicherdruck. Einer der Server hat viel mehr Hardware als benötigt.

Ich dachte, die fehlenden Pläne seien auf temporäre Tabellenerstellungen in der Mitte der gespeicherten Prozeduren zurückzuführen, aber das scheinen alte Informationen aus SQL Server 2000 oder früher zu sein. Ab SQL Server 2005 finden die Neukompilierungen auf Anweisungsebene für die Anweisungen nach der DDL statt. Trifft das auf alle Fälle zu oder kann es bei neueren Versionen immer noch vorkommen?

Was könnte der Schuldige für die fehlenden Pläne sein? Ich habe ein paar Artikel zu diesem Thema überflogen, aber nichts scheint zu passen.

"Für Ad-hoc-Workloads optimieren" ist auf dem Server aktiviert, den ich diese Woche betrachte. Eine der gespeicherten Prozeduren wird nur einmal am Tag ausgeführt. Ich habe den Code dafür. Ich habe nicht den Code für den, der über 100 Mal pro Minute ausgeführt wird, aber ich kann ihn bekommen. Ich kann den Code nicht posten, aber ich kann ihn in Bezug auf meine Frage beschreiben.

Ich glaube nicht, dass jemand den Prozedur-Cache freigibt oder saubere Puffer fallen lässt. Dieser Client verwendet Solarwinds DPA als eines seiner Überwachungstools. DPA hat einen der Ausführungspläne für die Anweisung in der gespeicherten Prozedur erfasst, die einmal am Tag aufgerufen wird. Diese Anweisung enthält eine große Anzahl von Lesevorgängen aufgrund einer nicht sargierbaren WHEREKlausel. Wenn DPA die Anweisung erfasst hat, handelt es sich um einen geschätzten Plan, der sich zu einem bestimmten Zeitpunkt im Plan-Cache befand. Ist einfach nicht da, wenn wir Probleme beheben. Ich lasse sie anfangen, sich sp_WhoIsActivean einem Tisch anzumelden.

Ich benutze sp_BlitzCache. (Ich arbeite für Brent Ozar Unlimited) Dies zeigt den Plan für die gesamte gespeicherte Prozedur sowie die Pläne für die einzelnen Anweisungen, falls vorhanden. Ist dies nicht der Fall, wird eine Warnung angezeigt: "Für diese Abfrage konnte kein Plan gefunden werden. Mögliche Gründe hierfür sind dynamisches SQL, RECOMPILEHinweise und verschlüsselter Code." Und diese Warnung steht auch auf den Aussagen.

TF 2371 ist nicht vorhanden. Ich schaue mir die Wartestatistik an. Der Server ist ziemlich gelangweilt. PLE ist über 130.000.

Ich habe jetzt den Code für 2 weitere gespeicherte Prozeduren. Einer von ihnen verwendet dynamisches SQL, exec (@sql)sodass wir wissen, warum es keinen Plan dafür gibt. Aber der andere, und das ist derjenige, der über 100 Mal pro Minute läuft, hat nichts Außergewöhnliches. Das einzige, was dabei auffällt, ist, dass die temporären Tabellen in der Mitte von über 1000 Codezeilen erstellt werden. Es werden auch einige untergeordnete gespeicherte Prozeduren aufgerufen.

In Bezug auf das Zwischenspeichern von Plänen in SQL Server 2008 werden keine Literale> = 8 KB angezeigt, aber eine der gespeicherten Prozeduren enthält einen Kommentar zu einer Masseneinfügung, bevor eine andere gespeicherte Prozedur aufgerufen wird. Die Masseneinfügung wird jedoch nicht in der äußeren gespeicherten Prozedur angezeigt, die ich gerade betrachte. Der Abschnitt "Recompilation Threshold" des Artikels ist interessant. Was ich für die temporären Tabellen sehe, sind Tonnen von INSERTs (die zu Millionen von Zeilen führen könnten), einige Aktualisierungen und Löschvorgänge. Es werden also viele Daten in den temporären Tabellen geändert. Millionen.

Tara Kizer
quelle
Da Sie die gespeicherten Prozesse haben, die das Problem wiedergeben, können Sie ein minimales Beispiel erstellen, das es wiedergibt, und auf diese Weise das Problem herausfinden?
Martin Smith

Antworten:

3

Es gibt zwei Plan-Cache-DMFs:

sys.dm_exec_query_plan - gibt zwischengespeicherte Pläne im XML-Format zurück, jedoch nur bis zu einer bestimmten Größe (und nur solange sie in SQL Server als XML formatiert werden können, dh bis zu 128 verschachtelte Ebenen).

sys.dm_exec_text_query_plan - gibt zwischengespeicherte Pläne im Textformat beliebiger Größe zurück. Der Nachteil ist jedoch, dass bei großen Plänen diese nicht in SQL Server in XML konvertiert werden können und sogar TRY_CONVERT als XML eine Null zurückgibt.

sp_BlitzCache trifft nur die frühere DMV (weil sie Abfragepläne als XML analysieren muss, um alle Arten von Slicing und Dicing durchzuführen.), die ich erstellt habe Github das Problem # 838 erstellt , um dies zu verbessern, damit wir die Benutzer zumindest warnen können, nach sys.dm_exec_text_query_plan zu suchen größere Abfragen. Eine XML-Analyse wird jedoch weiterhin nicht möglich sein.

Brent Ozar
quelle
Und der gleiche Grund sys.query_store_plan.query_planist auch nvarchar(MAX), nicht XML (SQL-Trivia).
Remus Rusanu
@RemusRusanu ooo, da tauchen so große Pläne auf! Nett.
Brent Ozar
Wir prüfen, ob die fehlenden Pläne auf das zurückzuführen sind, was Sie gefunden haben. Sobald ich etwas höre, werde ich ein Update veröffentlichen.
Tara Kizer
Ich markiere dies als die Antwort, obwohl ich keine Rückmeldung vom Kunden erhalten habe. Es ist das Einzige, was es sein könnte und macht angesichts der enormen Anfragen Sinn. Ich werde ein Update veröffentlichen, wenn sich etwas ändert.
Tara Kizer
@TaraKizer Sie tun dies nur, weil Ihre vierteljährliche Überprüfung ansteht, oder? Ich sehe, was du dort getan hast. BONUS ENTSPERRT.
Brent Ozar
0

Möglicherweise müssen Sie die maximale Größe der XML-Datei anpassen, die von SSMS an ein Grid zurückgegeben werden kann.

Stephen MORRIS
quelle
Nein, denn wie Tara bemerkt, kommen selbst dann keine Daten zurück, wenn Sie es in eine Tabelle schreiben und dort die Länge überprüfen.
Brent Ozar