Czyszczenie cache SQL Servera

4

Optymalizacja procedur składowanych czy zwykłych zapytań do bazy danych nie jest zadaniem wdzięcznym, ale potrafi dać bardzo wiele satysfakcji. Kto doświadczył zoptymalizowania działania jakiegoś potworka w taki sposób, że po pół godziny pracy czas wykonania spada z 2 minut do 1 sekundy, wie doskonale o czym mówię. A jak uda się tego dokonać bez grzebania się w indeksach to już w ogóle cud/miód/itd. Wtedy z kolei ten, kto to zapytanie pisał oryginalnie, zasługuje na siarczystego liścia… ale akurat w moim przypadku jestem to także ja, więc sobie ten krok darowuję:).

Ważne jest to, aby nie badać czasu wykonania instrukcji raz po razie bez uprzedniego wyczyszczenia cache silnika bazy danych. Co z tego, że coś wykonuje się szybciej po jakichś zmianach, skoro w bazie mogą już istnieć zoptymalizowane pod tym kątem struktury? Po wprowadzeniu zmian dobrze jest nakazać SQL Serverowi: "zapomnij o tym co wiesz, potraktuj moje kolejne instrukcje tak świeżo i dziewiczo, jak na to zasługują, nie starając się być mądrzejszym od samego zuluguli!". Dzięki temu różnica między wykonaniem oryginalnego a zmodyfikowanego zapytania faktycznie będzie miarodajna.

Instrukcji tych szukam w necie bardzo często bo nie zadałem sobie nigdy trudu żeby je zapisać bądź zapamiętać. Niniejszym więc je zapisuję, żeby nadal nie musieć ich pamiętać:

  1:  checkpoint
  2:  go
  3:  DBCC dropcleanbuffers
  4:  go

Po tych komendach serwer powinien być wyczyszczony ze skeszowanych danych, ze swoich wewnętrznych optymalizacji i tak dalej, eccecera.

A może to nie tak? A może da się to uzyskać w lepszy sposób? Porady i sprostowania mile widziane:).

Nie przegap kolejnych postów!

Dołącz do ponad 9000 programistów w devstyle newsletter!

Tym samym wyrażasz zgodę na otrzymanie informacji marketingowych z devstyle.pl (doh...). Powered by ConvertKit
Share.

About Author

Programista, trener, prelegent, pasjonat, blogger. Autor podcasta programistycznego: DevTalk.pl. Jeden z liderów Białostockiej Grupy .NET i współorganizator konferencji Programistok. Od 2008 Microsoft MVP w kategorii .NET. Więcej informacji znajdziesz na stronie O autorze. Napisz do mnie ze strony Kontakt. Dodatkowo: Twitter, Facebook, YouTube.

4 Comments

  1. Nie bij, wytłumacz.

    Ja np. sprawdzam obie wersje, z czyszczeniem (i oczywiści FREEPROCCACHE) i bez (w końcu w normalnych warunkach program tak pracuje). Przy okazji SQLa zrobię reklamę koledze: http://krzysztoflukowski.blogspot.com/ (mam nadzieję, że się Autor nie pogniewa).

  2. Zależy co dokładnie się chce usunąć z bufora..

    Jak chcesz cały cache wyczyścić (a nie tylko plany)
    DBCC DROPCLEANBUFFERS

    Jeżeli wszystkie plany we wszystkich bazach…
    DBCC FREEPROCCACHE
    albo konkretny plan
    DBCC FREEPROCCACHE (plan_handle)

    Jak chcesz wyczyścić w jednej bazie
    DBCC FLUSHPROCINDB (dbid)

    Jak chcesz wyczyścić konkretną grupę obiektów w cache:
    DBCC FREESYSTEMCACHE (pool_name)
    np
    DBCC FREESYSTEMCACHE (‘SQL Plans’)

  3. I jak to bywa dość regularnie, komentarze dużo bardziej wartościowe od samego posta, dzięki:)