Mamy gotową aplikację, która korzysta z bazy danych Microsoft SQL. W ramach tej aplikacji wybieramy i wybieramy różne kryteria wyboru dla każdego raportu. Ta aplikacja następnie uruchamia te raporty.
Uważam, że mamy problem z planem zapytań. Pierwszy raport, który uruchamiamy każdego dnia, działa bardzo szybko 7 minut. Każdy raport uruchamiany po pierwszym raporcie zajmuje ponad godzinę.
Każdej nocy uruchamiamy zaplanowane zadanie, które zatrzymuje i uruchamia SQL Server Agent i SQL Server. Istnieje około 25 innych baz danych w tym jednym wystąpieniu programu SQL Server. Żadne inne bazy danych nie mają problemów z wydajnością, tylko ten z półki, o której wspomniałem wcześniej.
Czy istnieje sposób na wyczyszczenie wszystkich planów zapytań, które SQL Server obecnie ma w pamięci?
Jak mogę to zrobić bez wpływu na około 30 użytkowników korzystających z innych baz danych na tym samym serwerze?
źródło
Odpowiedzi:
Przepraszam za moją poprzednią odpowiedź.
1) Dodaj opcję WITH RECOMPILE do instrukcji CREATE PROCEDURE, jeśli wiesz, że twoje zapytanie będzie się zmieniać za każdym razem, gdy zostanie uruchomione z procedury składowanej. Opcja Z RECOMPILE zapobiega ponownemu użyciu planu wykonania procedury składowanej, więc SQL Server nie buforuje planu dla tej procedury, a procedura jest rekompilowana w czasie wykonywania. Użycie opcji Z RECOMPILE może zwiększyć wydajność, jeśli zapytanie będzie się zmieniać za każdym razem, gdy zostanie uruchomione z procedury składowanej, ponieważ w tym przypadku nie zostanie użyty niewłaściwy plan wykonania.
2) Musisz stworzyć przewodnik po planie, w którym dla każdego typu zapytania (każdego typu żądania procedury składowanej) podpowiedź do zapytania USE PLAN wymusi wykonanie planu.
Oto artykuł o planie wykonania, który może pomóc.
źródło
Zadałeś tutaj dwa pytania. Po pierwsze, chcesz wiedzieć, czy możesz usunąć wszystkie plany przechowywane w pamięci dla instancji SQL. Odbywa się to za pomocą DBCC FREEPROCCACHE, jak sugerował Matt M.
Drugie pytanie, które zadałeś, brzmi: „Jak mogę to zrobić bez wpływu na około 30 użytkowników korzystających z innych baz danych na tym samym serwerze?”. Krótka odpowiedź brzmi „nie możesz”. Jeśli usuniesz wszystkie plany niż inni użytkownicy korzystający z planów znajdujących się w pamięci, prawdopodobnie ucierpi na wydajności.
Obejście tego problemu wymaga ręcznej interwencji. Możesz użyć DBCC FREEPROCCACHE, aby usunąć określone plany, pod warunkiem, że masz uchwyt_planu.
Z tego, co opisujesz powyżej, brzmi to jak kwestia planu, ale nie jestem pewien, czy usunięcie planów jest odpowiedzią. Przed zastanowieniem się nad usunięciem planów skierowałbym cię w stronę wąchania parametrów:
http://blogs.msdn.com/b/conor_cunningham_msft/archive/2010/08/11/conor-vs-misbehaving-parameterized-queries-optimize-for-hints.aspx
Powinieneś być w stanie zoptymalizować zapytania zamiast wygłupiać się za pomocą DBCC FREEPROCCACHE zgodnie z harmonogramem. Radzę również poświęcić czas na analizę zdarzeń oczekiwania na wystąpienie.
źródło
DBCC FREEPROCCACHE
Za pomocą tego polecenia możesz wyczyścić całą pamięć podręczną procedur do jednego polecenia. Zdecydowanie przeczytaj dokumentację przed użyciem tego polecenia. Przeczytaj kilka razy sekcję Uwagi.
Wyczyszczenie pamięci podręcznej procedur spowoduje rekompilację pamięci podręcznej procedur przechowywanych przy następnym użyciu. Może to wpłynąć na wydajność. Używaj ostrożnie!
Matt
źródło