Как предотвратить прослушивание параметров в операторе SELECT, который .NET превращается в EXEC? - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть оператор SQL SELECT, который очень быстро выполняется в SQL Server Management Studio (5 секунд), но выполняется очень медленно из моего кода ASP.NET.

Я читал, что это может быть связано ссниффинг параметров.Когда я запускаю инструкцию SELECT из SSMS, я использую SELECT.Но когда я смотрю SQL Profiler, мои операторы SELECT выполняются как хранимые процедуры с шаблоном: exec sp_executesql N'SELECT foo FROM bar WHERE userid = @ userid ', N' @ userid int ', @ userid = 2

Этот код ASP.NET истекает через четыре минуты (установка строки подключения):

SqlCommand objCommand = new SqlCommand("SELECT foo FROM bar WHERE userid = @userid", objCS);
SqlDataReader reader;
objCommand = new SqlCommand("", objCS);
objCommand.CommandType = CommandType.Text;
objCommand.Parameters.Add("@userid", SqlDbType.Int).Value = 1;
SqlDataReader reader = objCommand.ExecuteReader();

// время ожидания objCommand.ExecuteReader ();

Этот код выполняется в SQL Server ManagementStudio за 5 секунд:

DECLARE @userid AS Int = 2
SELECT foo FROM bar WHERE userid = @userid

Возвращает 60000+ строк за 5 секунд.

Как заставить код ASP.NET выполняться как оператор SELECT вместо хранимой процедуры при сохранениизначение безопасности параметризованных хранимых процедур?

РЕДАКТИРОВАТЬ: я думаю, что это может иметь отношение к другому пользователю, который выполняет код с операторами SQL по сравнению с пользователем, который выполняет операторы SQL в SSMS.Пользователь, работающий с кодом, имеет различные права доступа к серверу, включая ограниченный доступ к таблицам.Оператор SQL содержит представление, и пользователь не имеет основного доступа SELECT ко всем таблицам в этом представлении.Означает ли это также, что они не имеют доступа к статистике?

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Ваша проблема не относится к анализу параметров.Но установите опции с SSMS и Backend.Всякий раз, когда вы выполняете оператор из SSMS, он использует свойства, определенные SSMS.что вы можете увидеть в

ИНСТРУМЕНТЫ >> ОПЦИИ >> Выполнение запроса >> SQL Server >> Дополнительно

Вы получите SET ARITH_ABORT опциявключен в SSMS.но вы не в вашей процедуре.Итак, добавьте строку ниже в вашу процедуру и протестируйте ее снова.

SET ARITHABORT ON

Я очень уверен в вашей проблеме, она будет решена с этим.

0 голосов
/ 12 февраля 2019

Если это действительно анализ параметров (вам нужно будет увидеть фактический план, чтобы определить это), и вы уверены, что у вас есть правильные индексы на месте, вы можете обновить свой запрос, чтобы использовать подсказку индекса, но IMO этоне оптимальный способ.Если вы можете поместить свой запрос в хранимую процедуру, у вас есть возможность пометить свой хранимый процесс с помощью RECOMPILE, чтобы он не использовал первый план повторно.Это, IMO, более эффективная практика, чем форсирование подсказок индекса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...