Вашият код в SSMS не е същият код, който изпълнявате във вашето приложение. Този ред във вашето приложение добавя параметър NVARCHAR:
ada.SelectCommand.Parameters.AddWithValue("@clientID", ClientID);
докато в SSMS скрипта го декларирате като VARCHAR:
declare @clientID varchar(200)
Поради правилата за приоритет на типа данни Where client_id = @clientID
изразът във вашата заявка не е с възможност за SARG, където @clientID
е от тип NVARCHAR (правя скок на вяра и предполагам, че client_id
колоната е от тип VARCHAR). По този начин приложението принуждава сканиране на таблица, където SSMS заявката може да извърши бързо търсене на ключ. Това е добре познат и разбиран проблем с използването на Parameters.AddWithValue и е обсъждан в много статии преди, напр. вижте Как кодът за достъп до данни влияе върху производителността на базата данни. След като проблемът е разбран, решенията са тривиални:
-
добавете параметри с конструктора, който приема тип:
Parameters.Add("@clientID", SqlDbType.Varchar, 200)
(инаправи предайте изричната дължина, за да предотвратите замърсяването на кеша, вижте проблеми с производителността на заявките и планирайте кеша, когато дължината на параметъра не е посочена правилно -
или прехвърляне на параметъра в SQL текста:
where client_id = cast(@clientID as varchar(200))
.
Първото решение е по-добро, защото решава проблема със замърсяването на кеша в допълнение към проблема със способността за SARG.
Също така бих ви препоръчал да прочетете Бавно в приложението, Бързо в SSMS? Разбиране на мистериите на производителността