Czyszczenie cache SQL Servera

28 marca 2011 07:15 w kategorii: pro

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:).


Komentarze

dotnetomaniak.pl

28 marca 2011 07:40

Maciej Aniserowicz | Czyszczenie cache SQL Servera

Dziękujemy za publikację - Trackback z dotnetomaniak.pl

s

28 marca 2011 10:57

DBCC FREEPROCCACHE

PiotrB

28 marca 2011 11:14

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).

Lukasz Grala

28 marca 2011 11:15

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')

procent

28 marca 2011 23:00

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

Komentarze zamknięte