Was sind die Gründe dafür, dass ein Plan für gespeicherte Prozeduren im Cache fehlt?
WITH RECOMPILE
- Dynamisches SQL
- Verschlüsselter Code
- Signifikante Datenänderungen
- Statistiken aktualisieren
- 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 WHERE
Klausel. 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_WhoIsActive
an 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, RECOMPILE
Hinweise 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.