Jak wyczyścić wszystkie stare plany zapytań z poziomu Microsoft SQL Server?

12

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?

Michael Riley - AKA Gunny
źródło

Odpowiedzi:

7

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.

garik
źródło
Wyrażam zgodę na użycie Z RECOMPILE, zrobiłem to z systemami, które zbudowałem. Jednak nie mam dostępu do źródła sql ... działa z poziomu aplikacji.
Michael Riley - AKA Gunny
@ Cape Cod Gunny w tym przypadku spróbuj DBCC FLUSHPROCINDB: Służy do czyszczenia pamięci podręcznej procedury składowanej dla konkretnej bazy danych na serwerze SQL, a nie całego serwera SQL. Możesz użyć tego polecenia przed testowaniem, aby upewnić się, że poprzednie plany procedur składowanych nie wpłyną negatywnie na wyniki testów. Przykład: ZADEKLARUJ @ INTDER INTEGER @intDBID @intDBID = (WYBIERZ dbid FROM master.dbo.sys databases WHERE name = 'nazwa_bazy_danych') DBCC FLUSHPROCINDB (@intDBID)
garik
problem został rozwiązany. Okazało się, że tabela tymczasowa używana do przechowywania kryteriów wyszukiwania stale gromadziła dane. Proces ma obciąć dane z tej tabeli przed zebraniem danych. Dzięki za miły fragment kodu SQL.
Michael Riley - AKA Gunny
13

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.

SQLRockstar
źródło
DBCC FREEPROCCACHE nie rozwiązało problemu. Monitoruję aktywność i wydarzenia. Jest 0 fizycznych We / Wy. Wygląda na to, że zawiesił się na tej aplikacji: .Net Sql Client Data Provider. Typem oczekiwania jest CXPACKET.
Michael Riley - AKA Gunny
CXPACKET sugeruje, że twoje zapytanie przebiega równolegle. Czy możesz ustalić, ile wątków jest uruchomionych dla zapytania i sprawdzić ich oczekiwania? Możesz skorzystać z bezpłatnego narzędzia Adama Machanica WhoIsActive sqlblog.com/files/folders/release/entry29675.aspx .
SQLRockstar
7

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

Matt M.
źródło
Próbowałem użyć DBCC FREEPROCCACHE i to nie rozwiązało problemu. Skończyło się na tym, że zabiłem proces po 1 godzinie.
Michael Riley - AKA Gunny