nvarchar (max) замедление хранимой процедуры - PullRequest
0 голосов
/ 28 марта 2011

Со вчерашнего дня я сталкиваюсь с проблемой: когда я вызываю хранимый процесс из c #, он длится> 5, но когда я выполняю его напрямую из SSMS (на сервере), он длится менее 30 секунд.

Я искал на форумах и прошел через эту замечательную статью http://www.sommarskog.se/query-plan-mysteries.html, но безрезультатно.

Скрипт, содержащийся в моем процессе, извлекает 10 столбцов, среди которых столбец под названием "статья"типа nvarchar (max).

Когда я удаляю столбец статьи из моего выбора, мой процесс выполняется быстро.

Для дальнейшей логики я создал новый сохраненный процесс, получающий только первичный ключСтолбец и столбец nvarchar (max).

Я воспроизводлю то же поведение. Вот мой новый proc = MyNewProc (длится> 5 минут при вызове из c # и 0 секунд на сервере из SSMS)

  CREATE PROCEDURE Student.GetStudents
  AS
  BEGIN
 SET NOCOUNT ON
 -----------------
 SELECT StudentId,Article
 FROM Students
 WHERE Degree=1

 END 

MyNewProc возвращает только 2500 строк.

Это нормально?Как я могу улучшить это.

ВЫБЕРИТЕ СУММУ (DATALENGTH (Статья)) ОТ ШКОЛЬНИКОВ, ГДЕ = 1 результат - 13885838

Ответы [ 2 ]

1 голос
/ 28 марта 2011

Вы, вероятно, передаете много данных по сети.Это требует времени.

Вместо того, чтобы возвращать article, попробуйте вернуть LEFT(article, 50), чтобы узнать, является ли это проблемой с объемом данных.

Следует отметить, что SSMS запуститсязаполнять результаты немедленно, в то время как приложение C #, вероятно, не будет.

0 голосов
/ 28 марта 2011

В SSMS перейдите к следующему: Инструменты -> Параметры

Затем перейдите к Выполнение запроса -> SQL Server -> Дополнительно

Отсюда посмотрите, какие флажки установлены, и если что-то проверено, SSMS будет использовать это автоматически, когда вы выполняете sproc изнутри, но когда вы запускаете его из C # (или любого другого используя) не будет использоваться.

У меня была такая же проблема, и я обнаружил, что мне нужно добавить следующую строку в верхней части моего sproc, и она отлично работает:

SET ARITHABORT ON;

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