Wir haben eine bestimmte SQL Server 2008-Abfrage (keine gespeicherte Prozedur, sondern dieselbe SQL-Zeichenfolge - wird alle 5 Minuten ausgeführt), die zeitweise einen sehr schlechten Abfrageplan zwischenspeichert.
Diese Abfrage wird normalerweise in wenigen Millisekunden ausgeführt. Bei diesem fehlerhaften Abfrageplan dauert es jedoch mehr als 30 Sekunden.
Wie entferne ich chirurgisch nur den einen fehlerhaften zwischengespeicherten Abfrageplan aus SQL Server 2008, ohne den gesamten Abfragecache auf dem Produktionsdatenbankserver wegzublasen?
sql-server
sql-server-2008
cache
query
Jeff Atwood
quelle
quelle
Antworten:
Ich habe ein paar Dinge herausgefunden
zeigt alle zwischengespeicherten Abfragepläne an. Leider wird dort kein SQL-Text angezeigt.
Sie können den SQL-Text jedoch wie folgt mit den Plänen verknüpfen:
Ab hier ist es ziemlich trivial, eine
WHERE
Klausel hinzuzufügen , um die SQL zu ermitteln, von der ich weiß, dass sie in der Abfrage enthalten ist, und dann kann ich Folgendes ausführen:um jeden Abfrageplan aus dem Abfrageplan-Cache zu entfernen. Nicht ganz einfach oder praktisch, aber es scheint zu funktionieren.
edit: das dumpen des gesamten query caches funktioniert auch und ist weniger gefährlich als es sich anhört, zumindest nach meiner erfahrung:
quelle
Wenn Sie wissen, wie der gute Plan aussieht, verwenden Sie einfach einen Planhinweis .
Sie können einen bestimmten Cache-Eintrag nicht entfernen, aber Sie können einen gesamten Cache-Pool mit bereinigen
DBCC FREESYSTEMCACHE(cachename/poolname)
.Sie können den Cache-Namen eines fehlerhaften Abfrageplans abrufen, wenn Sie über das Plan-Handle verfügen (von sys.dm_exec_requests.plan_handle für die session_id in trouble während der Ausführung oder von sys.dm_exec_query_stats nach der Ausführung):
Alle SQL-Pläne haben jedoch den Namen "SQL-Pläne", was es schwierig macht, den richtigen für DBCC FREESYSTEMCACHE auszuwählen.
Aktualisieren
Vergessen Sie nicht
DBCC FREEPROCCACHE(plan_handle)
, ja, das wird funktionieren.quelle
sys.dm_exec_cached_plans
für dasplan_handle
von kein Eintrag vorhanden istsys.dm_exec_requests
?Die FREEPROCCACHE- Lösung ist in Ordnung, aber eine direktere Möglichkeit besteht darin, OPTION (RECOMPILE) für Ihren SQL-String zu verwenden (Sie haben erwähnt, dass es sich nicht um einen SP handelt). Dies teilt der Engine mit, dass es sich um einen Single Use-Plan handelt, da Sie dies wahrscheinlich vermuten Es gibt Parameter-Sniffing, oder Ihre Statistiken unterscheiden sich von Lauf zu Lauf erheblich, und Sie vermuten, dass es sich um ein Problem mit einem fehlerhaften Cache-Plan handelt.
quelle