Почему вызов DatabaseInstance.ExecuteSprocAccessor<T>(...) занимает так много времени для такого простого запроса?

Очень странное замедление при вызове блока приложения доступа к данным.

Вызываемый SP ("QuestionsToBeAnspted") возвращает 58 строк с тремя столбцами (два GUID и целое число: 21AF77DA-2E76-47DB-AB54-0E5C85CD9AD8, 21AF77DA-2E76-47DB-AB54-0E5C85CD9AF0, 2) менее чем за 1 секунду, когда выполняется непосредственно на сервере. Мой опыт работы с SQL довольно хороший, и я убежден, что проблема не существует на сервере SQL.

Однако, когда он вызывается через DAAB, для возврата коллекции объектов требуется очень много времени. ExecuteSprocAccessor(...) обычно возвращает IEnumerable, и SP не выполняется до тех пор, пока коллекция не будет перечислена или иначе не использована, поэтому эта проблема не отображается, пока не произойдет потребление.

DatabaseInstance.ExecuteSprocAccessor<T>(storedProcedure, rowMapper, args);

Учитывая, что в том же коде нет проблем с возвратом>200 строк значительно более сложной информации, я озадачен тем, почему этот код выполняется так долго (55 секунд!).

Любые идеи будут приветствоваться...

1 ответ

Вы можете попробовать запустить SQL Profiler, чтобы посмотреть, как выглядит реальный вызов, когда он выполняется с использованием DAAB. Имея это в виду, взгляните на план выполнения, который он использует.

В прошлом я писал некоторый код, который работал нормально как запрос SQL, но был очень медленным как хранимая процедура. Оказывается, для некоторых дублирующихся индексов оптимизатор запросов использовал другой план выполнения для SQL-запроса, чем хранимая процедура. После сортировки индексов оба бегали с одинаковой скоростью.

Другие вопросы по тегам