DBCC FREEPROCCACHE
nie działa w usłudze Azure SQL DB. Jak inaczej zmusić plan wyrzucenia się z pamięci podręcznej w sposób, który nie zaszkodzi systemowi produkcyjnemu (tzn. Nie mogę po prostu zmieniać tabel, chcąc nie chcąc)? Jest to specjalnie dla SQL utworzonego przez Entity Framework, więc nie są to samodzielnie zarządzane przechowywane procy - to efektywnie dynamiczny SQL.
(Źródłem były złe indeksy -> złe statystyki itp. To wszystko zostało naprawione, ale zły plan nie zniknie.)
AKTUALIZACJA: Wybrałem rozwiązanie @ mrdenny, gdy dotarł tam pierwszy. Jednak z powodzeniem używam skryptu @Aaron Bertrand do wykonywania pracy. Dziękuję wszystkim za pomoc !!
sql-server
execution-plan
azure-sql-database
Jaxidian
źródło
źródło
sp_executesql
.Odpowiedzi:
Azure SQL teraz bezpośrednio to obsługuje
Baza danych Azure SQL bezpośrednio obsługuje czyszczenie pamięci podręcznej proc bieżącej bazy danych użytkownika bez żadnych włamań:
Dodatkowe informacje
Poniższy skrypt ( Shannon Gowen ) może być używany do oglądania procesu krok po kroku:
źródło
Nie ma dziś na to jednoznacznego sposobu, ale nie jest to stały scenariusz (komenda DBCC nadal nie jest obsługiwana, ale czytana w magazynie zapytań ). Nawet jeśli trafienie zmiany schematu jest dopuszczalne, może nie być tym, czego chcesz, ponieważ spowoduje to unieważnienie wszystkich planów związanych z obiektem bazowym, nie tylko złym.
Nie szukanie uznania za to, ale budowanie dynamicznego SQL w celu wykonania tej samej operacji na wielu tabelach jest dość łatwe:
(Napisałem wskazówkę dotyczącą tego problemu dotyczącego „długości dynamicznego SQL” ...)
źródło
nvarchar(max)
zmienna osiąga limit po 4000 znaków, 8000 znaków, jeśli zmienię navarchar(max)
. Uruchamianie dokładnie tego skryptu. Mamy ~ 450 tabel, więc łatwo to trafiliśmy (~ 30/60 tabel w).varchar(max)
jest poprawną składnią, jest po prostu identycznavarchar(8000)
invarchar(max)
identyczna znvarchar(4000)
.PRINT
polecenie wyświetla tylko 8000 bajtów. To ograniczeniePRINT
polecenia, a nie Azure. Jeśli uruchomisz polecenie, będzie działać, nawet jeśli nie możesz wizualnie sprawdzić całości.Dodaj kolumnę zerowalną do tabeli, a następnie upuść kolumnę. Zmusi to SQL do opróżnienia pamięci podręcznej dla tego obiektu.
Jeśli chodzi o wykonanie wszystkich tabel, kursor powinien załatwić sprawę. Wystarczy użyć nazwy kolumny, która nigdy nie będzie istnieć w żadnej tabeli, takiej jak „zzzzzz_go_away” lub coś w tym rodzaju.
źródło
Baza danych Azure SQL obecnie nie obsługuje
DBCC FREEPROCCACHE
, więc nie można ręcznie usunąć planu wykonania z pamięci podręcznej. Jeśli jednak wprowadzisz zmiany w tabeli lub widoku, do którego odwołuje się zapytanie (ALTER TABLE
/ALTER VIEW
), plan zostanie usunięty z pamięci podręcznej. ( Odnośnik .)źródło
Aby wyczyścić cały plan wykonania, użyj tego:
W przypadku zmiany tabeli lub widoku do niej odwołującego się plan wykonania zostanie wyczyszczony.
Trochę więcej wyjaśniono tutaj http://christianarg.wordpress.com/2013/08/22/remove-execution-plans-from-the-procedure-cache-in-sql-azure/
źródło