I dine forespørgsler skal du tilføje OPTION(OPTIMIZE FOR UNKNOWN)
(som sidste klausul) for at forhindre parametersniffing. For syntaks og forklaring, se dokumentationen på Forespørgselstip
.
Hvad SQL Server gør første gang, den kører en lagret procedure, er at optimere eksekveringsplanerne for de parametre, der blev sendt til den. Dette gøres i en proces, der kaldes Parameter Sniffing
.
Generelt cachelagres eksekveringsplaner af SQL Server, så SQL Server ikke behøver at rekompilere hver gang for den samme forespørgsel. Næste gang proceduren køres, vil SQL Server genbruge eksekveringsplanen(erne) til forespørgslerne i den... Udførelsesplanen(erne) kan dog være totalt ineffektive, hvis du kalder den (dem) med forskellige parametre .
Den mulighed, jeg gav dig, vil fortælle SQL-kompileren, at udførelsesplanen ikke skal være optimeret til specifik parametre, men snarere for enhver parameter, der sendes til den lagrede procedure.
For at citere dokumentationen:
I nogle tilfælde kan Stored Procedures drage fordel af Parameter Sniffing, i nogle tilfælde gør de det ikke. For de lagrede procedurer, der ikke drager fordel af Paramater Sniffing, kan du tilføje muligheden til hver forespørgsel, der bruger en af parametrene i den lagrede procedure.