Wir haben dieses Problem in unserer Produktionsumgebung.
Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64) - Enterprise Edition (64-Bit) unter Windows NT 6.1 (Build 7601: Service Pack 1).
SQL Server löscht alle (fast 100%) alten Ausführungspläne und erstellt sie täglich über Nacht (von 23:00 Uhr bis 08:00 Uhr) neu. Dies geschah sogar, als die "Auto-Update-Statistiken" deaktiviert waren. Wir haben die "Auto-Update-Statistiken" für die letzten 2-3 Wochen aktiviert. Aber es passiert immer noch.
Wir wissen nicht genau, was diese Neuerstellung von Plänen auslöst, aber wir sind sicher, dass wir dies nicht manuell tun.
Das einzige, was wirklich mit dem Zeitpunkt der Wiederherstellung der Pläne zusammenfällt, ist ein DB-Wartungsjob, den wir haben: die tägliche Indexreorganisation (bei einer Fragmentierung von 5-30%) und die tägliche Indexrekonstruktion (bei einer Fragmentierung von mehr als 30%). ) Job. Normalerweise führt diese tägliche Wartung nur eine Reorganisation durch (da die Indexfragmentierung täglich nie mehr als 30% beträgt).
Einschlag:
Diese neu erstellten Pläne bewirken, dass einige UDF-Aufrufe / Abfrageaufrufe (die von der Benutzeroberfläche / von Webseiten aus aufgerufen werden) viel länger dauern (Minuten statt weniger als 1 Sekunde), sodass die Sitzungen sich nur aufstapeln und die CPU fast 90% beanspruchen. .
Das Problem verschwindet in dem Moment, in dem diese blockierten Sitzungen zwangsweise gelöscht werden (auf der DB-Seite) und 1) wenn alle entsprechenden Ausführungspläne manuell gelöscht werden (für Abfragen) oder 2) wenn die UDFs geändert werden (für Funktionen). Alle neuen Pläne, die von diesem Moment an von SQL Server erstellt wurden, funktionieren den ganzen Tag über einwandfrei, bis am nächsten Morgen dasselbe Problem auftritt. Außerdem ist dieses Verhalten nicht zu 100% konsistent. Wir sehen es nicht jeden Morgen. Aber es hat Zeiträume gegeben, in denen wir es 4-5 Tage hintereinander durchgehend gesehen haben.
Das Problem tritt vormittags auf, wenn die Benutzeroberfläche oder die Webseiten offenbar intensiver aufgerufen werden.
Hat jemand eine Ahnung, was dies verursacht und wie man dieses Problem löst? Jede Hilfe wäre sehr dankbar.
quelle
Antworten:
Nun, ich habe einige Ideen, die dieses Verhalten verursachen könnten.
optimize for ad hoc workloads
, wodurch nur ein Plan-Stub gespeichert und bei Bedarf kompiliert wird. Dies verringert die Belastung Ihres Plancaches, wodurch die Wahrscheinlichkeit einer Plancache-Leerung verringert wird. Sie können es mit aktivierensp_configure 'optimize for ad hoc workloads',1; reconfigure
. Dies ist möglich, wenn Sie dieadvanced options
Verwendung aktiviert habensp_configure 'show advanced options',1; reconfigure
.Gleich neben all dieser Möglichkeiten kann es sinnvoll sein , um die Protokolldateien für einige Änderungen an den Optionen zu prüfen
affinity mask
,affinity I/O mask
und ihre x64 - Partner. Eine andere Sache kann eine Änderung derMAXDOP
Option Ihrer Instanz sein. Bitte überprüfen Sie auch die Protokolle. Sie müssen auch den Plancache leeren.Zu guter Letzt können Sie noch einen serverseitigen Trace ausführen (indem Sie ihn mit dem Profiler einrichten, starten, stoppen und mit dem Befehl sql erneut auf dem Server starten). Daneben
perfmon
ist dein Freund. Es kann Ihre Leistungswerte eine Zeit lang beobachten und überwachen. Möglicherweise können Sie Parallelen im Druck bei bestimmten Aktionen auf Ihrem Server feststellen, die zu Flush führen können.Hoffentlich hilft dir das, auch wenn die Antwort etwas später kommt.
quelle