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:).
DBCC FREEPROCCACHE
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).
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’)
I jak to bywa dość regularnie, komentarze dużo bardziej wartościowe od samego posta, dzięki:)