2012-01-24 16 views
5

Mam kilka pytań dotyczących wydajności programu Microsoft SQL Server 2008, głównie dotyczących planów wykonania.Buforowanie wykonania instrukcji SQL

Według, aby MSDN, procedury składowane mają lepszą wydajność w porównaniu do bezpośrednich zapytań SQL, ponieważ:

Baza danych może przygotować, optymalizacji i buforować plan wykonania tak, że plan wykonania mogą być ponownie wykorzystane przy A pozniej.

Moje pierwsze pytanie brzmi: dlaczego tak jest. Wcześniej czytałem, że przy użyciu sparametryzowanych zapytań (przygotowanych instrukcji) plan wykonania jest buforowany dla kolejnych wykonań z potencjalnie różnymi wartościami (kontekst wykonania). Czy procedura przechowywana nadal byłaby bardziej wydajna? Jeśli tak, czy plan wykonania procedury składowanej jest odtwarzany tylko na żądanie, czy jest po prostu mniej prawdopodobne, że zostanie wyczyszczony z pamięci podręcznej? Czy sparametryzowane zapytanie jest traktowane jako ad-hoc query, co oznacza, że ​​plan wykonania zostanie prawdopodobnie usunięty z pamięci podręcznej?

Ponadto, ponieważ nadal jestem nowicjuszem w tej dziedzinie, zastanawiam się, czy istnieją pewne polecenia, które działają tylko w T-SQL. Mam zapytanie, które trwa ~ 12 sekund, aby wykonać w pierwszym uruchomieniu, a następnie ~ 3 sekundy po tym, zarówno w Microsoft SQL Management Studio i ADO.NET. Zapytanie ma być nieskuteczne w ramach mojej prezentacji. Chodzi o to, że w moim zapytaniu używam zarówno CHECKPOINT i DBCC DROPCLEANBUFFERS jak i , a także OPTION (RECOMPILE). Jednak co najmniej dwa pierwsze nie wydają się mieć znaczenia, ponieważ zapytanie trwa jeszcze 3 sekundy. Zgaduję, że to dlatego, że pamięć podręczna danych nie jest czyszczona. Wszelkie pomysły, dlaczego pamięć podręczna nie wydaje się być wyczyszczone, lub wszelkie pomysły, dlaczego moje zapytanie jest znacznie szybciej po pierwszym wykonaniu?

Oto pytania, na które mogę teraz liczyć.

+2

Dobre pytania - podzieliłbym ten post na kilka postów, może jeden post na pytanie o przechowywane-proc vs sparametryzowane zapytania, jeden post dla wielu uruchomień zapytania, itp. –

+0

Być może masz rację; mój umysł myślał, żeby nie spamować. :-) – Andy0708

+0

Ideą stackoverflow jest utrzymywanie pytań skupionych na tym, aby z kolei odpowiedzi mogły być również skupione - więc nie martw się o załadowanie strony z mnóstwem pytań. –

Odpowiedz

3

"Czy procedura składowana nadal byłaby bardziej wydajna?": Zasadniczo nie. Oszczędza to bardzo mało. Z punktu widzenia wydajności można w zasadzie używać literałów SQL w swojej aplikacji (chyba że są OGROMNE). Serwer SQL dopasuje ciąg wysyłany do niego do buforowanego planu, w porządku.

"Mam zapytanie, które trwa ~ 12 sekund, aby wykonać przy pierwszym uruchomieniu, a następnie ~ 3 sekundy po" Biorąc pod uwagę, że wyczyściłeś wszystkie pamięci podręczne, jest to prawdopodobnie problem statystyczny. SQL Server automatycznie tworzy statystyki przy pierwszym dostępie do kolumny. Sądzę, że to się stało raz wam. Spróbuj uruchomić sp_updatestats (zanim wyczyścisz pamięć podręczną).

+0

wiesz, czy plany wykonania procedur składowanych i sparametryzowanych zapytań są "traktowane" w ten sam sposób w pamięci podręcznej? Mam na myśli to, że jeśli ktoś jest bardziej podatny na zaczerwienienie niż drugi. Czyszczenie statystyk nie ma większego wpływu. – Andy0708

+0

Nie sądzę, że mają różne właściwości flushing.Flushing występuje tylko wtedy, gdy pamięć jest krótka, więc to może nie mieć znaczenia dla ciebie. – usr

+0

Utrzymywanie całego kodu w plikach sprocs ze względu na wydajność jest naprawdę nieaktualne. – usr

Powiązane problemy