Arhn - архитектура программирования

Запрос выполняется за 4 секунды непосредственно в SQL Server, но занимает ›30 секунд в ASP.NET?

У меня есть запрос (около 1600 строк, хранящихся как хранимая процедура), выполнение которого занимает около 3 секунд (после его оптимизации путем добавления правильных индексов) при выполнении в среде SQL Server Management Studio.

Я написал для этого обертку на C # и предоставил себе возможность использовать URI для выполнения этого запроса. Однако это занимает более 30 секунд для выполнения, и из-за этого, когда я запускаю этот запрос как часть цикла, браузер останавливается из-за слишком большого количества ожидающих запросов. Я написал обертку так:

try
{
   string ConString = Constants.connString;

   using (con = new SqlConnection(ConString))
   {
      cmd = new SqlCommand(sql, con);
      con.Open();
      dr = cmd.ExecuteReader();

      while (dr.Read())
      {
         ...
      }
   }
}

Моя строка подключения такова:

Data Source={0};Initial Catalog={1};Integrated Security=True;MultipleActiveResultSets=true

Я знаю, что сам запрос хорош, потому что я запускал его несколько раз внутри SSMS, и он работал нормально (в среднем менее 5 секунд). И я был бы рад предоставить больше отладочной информации, за исключением того, что я не знаю, что предоставить.

С чего бы мне начать для устранения таких проблем?

РЕДАКТИРОВАТЬ:

Я запустил SQL Profiler и собрал некоторую статистику. Вот что я наблюдаю. Очень странно, что выполняется именно тот запрос. Дайте мне знать, если я могу что-то еще сделать на этом этапе.

введите описание изображения здесь

26.02.2013

  • Между какой строкой и какой строкой проходит 30 секунд? 27.02.2013
  • @MikeChristensen: Он останавливается на cmd.ExecuteReader(). 27.02.2013
  • Вы говорите, что командная строка SQL состоит из 1600 строк или что она возвращает 1600 строк? 27.02.2013
  • Это простой текст SQL, отправленный из кода C #, или хранимая процедура, сохраненная в SQL Server и только что вызванная с помощью ADO.NET? 27.02.2013
  • Вы можете попробовать запустить SQL Server Profiler, чтобы увидеть, как быстро запрос доставляется на сервер, и сколько времени фактически требуется для его выполнения. 27.02.2013
  • @RBarryYoung: это 1600 строк, но в основном это связано с перечислением имен столбцов. Сама по себе логика проста. 27.02.2013
  • @MarcinJuraszek: Это простой текст SQL, который отправляется с C #. 27.02.2013
  • @mellamokbtheWise: Понятно. Я попробую это сейчас. Спасибо! 27.02.2013
  • Зачем отправлять 1600 строк кода SQL вместо того, чтобы иметь хранимую процедуру и вызывать ее? 27.02.2013
  • @istepaniuk: Ты прав. Это тестовая среда, и позже я конвертирую ее в SP. 27.02.2013
  • Так, может быть, тебе стоит пропустить и тестирование производительности на потом? ... Какой смысл тестировать вещь, которая скоро изменится? 27.02.2013
  • @Legend Это чертовски большая командная строка, которую нужно отправлять на сервер каждый раз, когда вы зацикливаетесь. И если большинство из этих строк являются именами столбцов, я могу сказать вам, что 1000+ столбцов - это чертовски много столбцов, которые нужно вернуть клиенту. Это далеко за пределами нормы. 27.02.2013
  • В порядке; Думаю, я потрачу некоторое время на создание SP на сервере. Я думаю, что это не настоящая проблема, но я все равно внесу изменения. Спасибо вам за ваши предложения. 27.02.2013
  • Я внес все предложенные изменения и запустил профилировщик SQL. Обновил мой вопрос подробностями. Обратите внимание на то, что .NET Client занимает ›18 секунд, тогда как SSMS занимает всего 3 секунды. 27.02.2013
  • возможный дубликат stackoverflow.com/questions/2736638/ 27.02.2013

Ответы:


1

В порядке; Наконец, нашел ответ здесь и здесь. Ответ воспроизведен здесь для удобства. Спасибо оригинальному плакату, Жаку Бошу, который, в свою очередь, взял его у здесь. Не могу поверить, что эта проблема была решена в 2004 году!

Проблема, похоже, вызвана анализом параметров < / а>. Чтобы предотвратить это, просто присвойте значения входящих параметров другим переменным, объявленным прямо в верхней части SP.

См. Эту красивую статью об этом

Пример:

CREATE PROCEDURE dbo.MyProcedure
(
    @Param1 INT
)
AS

declare @MyParam1 INT
set @MyParam1 = @Param1

SELECT * FROM dbo.MyTable WHERE ColumnName = @MyParam1 

GO

Я скопировал эту информацию из eggheadcafe.com.

26.02.2013

2

Запросы часто выполняются быстрее в среде SQL Server Management Studio из-за кэширования планов запросов. Перед тестированием попробуйте запустить sp_recompile для хранимой процедуры. Это очистит план запроса.

Более подробную информацию можно найти здесь: http://www.sommarskog.se/query-plan-mysteries.html

26.02.2013

3

Почему вы не используете XML вместо набора результатов? Насколько мне известно, использование XML намного быстрее, чем чтение набора результатов. поэтому в этом случае вы должны использовать что-то вроде этого:

SELECT * 
FROM [Table Name]
FOR XML PATH('[Your Path]'), ELEMENTS XSINIL, ROOT('Your Root')

и после этого, я думаю, вы можете сериализовать его в своем проекте.

26.02.2013

4

Однажды у меня была такая же проблема, и оказалось, что разница была вызвана настройкой ARITHABORT, которая отличается при подключении через студию управления SQL. Соединение .net устанавливает для параметра ARITHABORT значение OFF, а студия управления SQL устанавливает для этого параметра значение ON.

Если у вас возникла та же проблема, вы можете попробовать выполнить SET ARITHABORT OFF в SQL Management Studio, а затем выполнить свой запрос.

Вот тема, что объясняет, почему этот параметр может вызвать такую ​​резкую разницу в производительности.

26.02.2013
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..