2012-01-29 6 views
6

Jakie czynniki, o których powinienem wiedzieć, mogą powodować nadmierną rekompilację procedury przechowywanej?Jakie czynniki mogą powodować rekompilację procedur przechowywanych na serwerze SQL?

Przydałyby się przykłady kodu, który spowoduje rekompilację procedury składowanej. Celem byłoby uniknięcie ponownej kompilacji, jeśli to możliwe, co powinno poprawić wydajność.

Dynamiczne SQL i zmienne ścieżki prowadzące do różnych wyników (według typu danych i/lub liczby kolumn) wydają się być problematyczne. Czy założenia są prawidłowe? Czy są inne przykłady.

Edytuj: Znalazłem inny przykład. Utworzenie tabeli tymczasowej w instrukcji sterowania przepływem spowoduje ponowną kompilację.

+0

Tak. Teraz o co chodzi? –

+2

Myślę, że musisz zadać konkretne pytanie. –

Odpowiedz

17

Istnieje kilka sposobów, aby zapewnić rekompilacji procedury przechowywanej:

  • użyciu WITH RECOMPILE,
  • podejmowania procedura przechowywana dynamikę (myślę exec())
  • znakowanie proc do ponownej kompilacji z sp_recompile.
  • zmianę schematu, że w pamięci podręcznej planu kwerend opiera
  • wywołującego DBCC FREEPROCCACHE
  • Na poziomie zapytań sprawozdaniem jednostkowym ciągu proc mogą być ponownie skompilowana z nutą zapytań RECOMPILE (SQL 2008).

Czynniki rekompilacji

Oprócz twardych czynników wymienionych powyżej, co powoduje, że procedura przechowywana rekompilacji? Cóż, wiele rzeczy. Niektóre z nich są splecione z powyższą listą, ale chcę je ponownie przedstawić b/c, co może nie być oczywiste.

  • Wstawianie lub usuwanie dużej ilości danych (gęstość danych w indeksach & stoły często kontroluje planów kwerend)
  • Odbudowa indeksów (zmiana obiektów bazowych)
  • Tworzenie/upuszczanie tabel tymczasowych (ponownie, leżące u podstaw zmian DML).
  • planu kwerend ages out (nie myśl wykorzystywane niedawno i SQL chcą, aby oczyścić wykorzystania pamięci)

To bynajmniej nie wyczerpującej listy. Optymalizator zapytań ewoluuje i zaskakuje niezależnie od tego, jak długo korzystasz z SQL Server. Ale tutaj są pewne środki, które mogą być użyteczne:

ALE CZEKŁO - ALE WIĘCEJ!

Z tym stwierdzeniem, domniemaniem w twoim pytaniu jest, że rekompiluje zawsze złe wykonanie. W rzeczywistości często rekompliacja jest dobra.

Więc kiedy chcesz go przekompilować? Spójrzmy na jeden przykład proc, który wyszukuje po nazwisku. Przechowywane procedury to "parameter sniffing", które jest błogosławieństwem (jeśli działa dla ciebie) i przekleństwem (jeśli działa przeciwko tobie). Najpierw przekaż komuś hasło: Zebr% dla zerbrowskiego. Indeks ostatnich nazw zdaje sobie sprawę, że jest to bardzo specyficzne i zwróci, powiedzmy, 3 wiersze z miliona - więc jeden plan wykonania jest zbudowany. Z proc skompilowany dla wyniku niskiego rzędu, następne wyszukiwanie jest dla S%. Cóż, S jest Twoim najczęstszym imieniem i pasuje do 933,543 wierszy z 1 miliona.

1

Niektóre opcje SET mogą spowodować rekompilację procedury przechowywanej, a nawet wielokrotne rekompilacje w jednym wykonaniu!

Niektóre z tych opcji mogą być nawet wewnątrz SP

--this will cause recompilation 
SET concat_null_yields_null ON; 
EXEC spMyProc; 

Niektóre z opcji, które powodują rekompilacji gdy wewnątrz SP:

ARITHABORT

ANSI_NULLS

QUOTED_IDENTIFIER

Na szczęście, o ne nie powoduje ponownej kompilacji: SET NOCOUNT ON;