DBCC FREEPROCCACHE
funktioniert nicht in Azure SQL DB. Wie sonst kann ich einen Plan dazu zwingen, sich auf eine Weise aus dem Cache zu werfen, die einem Produktionssystem nicht schadet (dh ich kann nicht einfach ohne weiteres Tische wechseln)? Dies ist speziell für SQL gedacht, das von Entity Framework erstellt wurde. Es handelt sich also nicht um selbstverwaltete gespeicherte Prozesse, sondern um dynamisches SQL.
(Quelle waren schlechte Indizes -> schlechte Statistiken usw. Das ist alles behoben, aber ein schlechter Plan wird nicht verschwinden.)
UPDATE: Ich habe @ mrdennys Lösung ausgewählt, als er zuerst dort ankam. Ich verwende jedoch erfolgreich das Skript von @Aaron Bertrand, um die Arbeit auszuführen. Vielen Dank an alle für die Hilfe !!
quelle
sp_executesql
.Antworten:
Azure SQL unterstützt dies jetzt direkt
Azure SQL-Datenbank unterstützt direkt das Löschen des Prozesscaches der aktuellen Benutzerdatenbank ohne Hacks:
zusätzliche Information
Das folgende Skript (von Shannon Gowen ) kann verwendet werden, um den Prozess Schritt für Schritt zu beobachten:
quelle
Es gibt heute keinen expliziten Weg, dies zu tun, aber das ist kein permanentes Szenario (der DBCC-Befehl wird immer noch nicht unterstützt, aber im Query Store nachgelesen ). Selbst wenn der Treffer für die Schemaänderung akzeptabel ist, kann es sein, dass er nicht Ihren Wünschen entspricht, da dadurch alle Pläne ungültig werden, die sich auf das zugrunde liegende Objekt beziehen, nicht nur das schlechte.
Dies nicht zu würdigen, aber es ist ziemlich einfach, dynamisches SQL zu erstellen, um denselben Vorgang für mehrere Tabellen auszuführen:
(Ich habe einen Tipp zu diesem Thema "Länge von dynamischem SQL" geschrieben ...)
quelle
nvarchar(max)
Variable nach 4000 Zeichen ein Limit erreicht, 8000 Zeichen, wenn ich es auf änderevarchar(max)
. Genau das Skript ausführen. Wir haben ~ 450 Tische, also schlagen wir das leicht (~ 30/60 Tische in).varchar(max)
hat eine gültige Syntax, ist nur identisch mitvarchar(8000)
undnvarchar(max)
ist identisch mitnvarchar(4000)
.PRINT
den Befehl, zeigt es nur 8000 Bytes. Dies ist eine Einschränkung desPRINT
Befehls und nicht von Azure. Wenn Sie den Befehl ausführen, funktioniert er auch dann, wenn Sie das Ganze nicht visuell überprüfen können.Fügen Sie der Tabelle eine nullfähige Spalte hinzu, und löschen Sie die Spalte. Dadurch wird SQL gezwungen, den Cache für dieses Objekt zu leeren.
Wie bei allen Tabellen sollte ein Cursor den Trick ausführen. Verwenden Sie einfach einen Spaltennamen, der in keiner Tabelle vorhanden sein wird, z. B. 'zzzzzz_go_away' oder so.
quelle
Azure SQL-Datenbank wird derzeit nicht unterstützt
DBCC FREEPROCCACHE
, sodass Sie einen Ausführungsplan nicht manuell aus dem Cache entfernen können. Wenn Sie jedoch Änderungen an einer Tabelle oder Ansicht vornehmen, auf die die Abfrage (ALTER TABLE
/ALTER VIEW
) verweist, wird der Plan aus dem Cache entfernt. ( Referenz .)quelle
Verwenden Sie Folgendes, um den gesamten Ausführungsplan zu löschen:
Wenn Sie eine Tabelle oder Ansicht ändern, die darauf verweist, wird der Ausführungsplan gelöscht.
Ein bisschen mehr erklärt hier http://christianarg.wordpress.com/2013/08/22/remove-execution-plans-from-the-procedure-cache-in-sql-azure/
quelle