Przed uruchomieniem testu wydajności / linii bazowej dla aplikacji korzystającej z programu SQL Server chcę ustawić instancję w stanie „czystym” bez ponownego uruchamiania instancji. Są kroki, które zwykle wykonuję, ale chcę zbudować ostateczną listę, która ma prawidłową kolejność i nie zawiera zbędnych kroków.
Czy ta lista kroków umożliwia ustawienie programu SQL Server w stan „czysty”?
Czy sekwencja jest logiczna / poprawna?
Czy są jakieś zbędne kroki?
CHECKPOINT -- Write all dirty pages
DBCC DROPCLEANBUFFERS -- All should be clean after checkpoint?
DBCC FREEPROCCACHE -- Clear the plan cache
DBCC FREESYSTEMCACHE -- Is this necessary after FREEPROCCACHE?
DBCC FREESESSIONCACHE -- May not be necessary if distributed queries aren't used, but want to catch all scenarios
EXEC SP_UPDATESTATS -- Refresh stats
'BEGIN TESTING!'
sql-server
dbcc
performance-testing
cache
Eric Higgins
źródło
źródło
DROPCLEANBUFFERS
jest miły do testowania, ale nie zawsze dokładny. Jeśli odwołujesz się do tabeli o dużej objętości, jest bardzo prawdopodobne, że prawie zawsze będziesz mieć strony w pamięci, a czas IO nie będzie dużym czynnikiem w tym zapytaniu. W takim przypadku możesz kłaść większy nacisk na IO niż jest to realistyczne.Odpowiedzi:
Najpierw cofnę się i zapytam, jakie pomiary planujesz zebrać podczas testu. Jeśli na przykład liczysz logiczne odczyty według zapytania, nie musisz zwalniać pamięci podręcznej. Jestem wielkim fanem korzystania z odczytów logicznych, ponieważ jest to niezależne od tego, czy dane są buforowane, czy na dysku - a podczas produkcji trudno zgadnąć, czy dane zapytania będą buforowane, czy nie (chyba że buforujesz całą bazę danych w pamięci) . Jeśli dostroisz się, aby zminimalizować odczyty logiczne, aplikacja będzie działać szybciej, niezależnie od tego, czy dane są w pamięci podręcznej, czy nie.
Następnie zapytałbym, co się zmienia między biegami. Na przykład, uruchamiając EXEC SP_UPDATESTATS w każdej bazie danych, jak zasugerowałeś, zamierzasz ponownie próbkować statystyki tabel, które zostały zaktualizowane. Jednak, chyba że aktualizujesz statystyki za pomocą fullscan, otrzymujesz losowe wiersze z tabeli - to nie jest zbyt powtarzalne i nie sądzę, że naprawdę chcesz to zrobić. Zamiast tego możesz przywrócić bazy danych między każdym uruchomieniem, aby zawsze testować dokładnie te same dane. Jeśli Twoje testy wykonują operacje wstawiania / aktualizacji / usuwania, mogą mieć różne profile wydajności przy każdym uruchomieniu, jeśli nie przywracasz bazy danych (ponieważ dodają / zmieniają dane oraz zmieniają statystyki danych) - a nawet gorzej,
źródło