Почему время ожидания отчета SSRS истекает, когда хранимая процедура, на которой он основан, возвращает результаты в течение нескольких секунд?

StackOverflow https://stackoverflow.com/questions/237069

Вопрос

У меня есть отчет, который отображает данные, возвращаемые хранимой процедурой.Используя профилировщик, я могу перехватить вызов хранимой процедуры из служб отчетов.

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

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

Я знаю, что хранимую процедуру можно было бы оптимизировать еще больше, но я не понимаю, почему SSRS истекает по тайм-ауту, если кажется, что выполнение из SSMS занимает всего несколько секунд.

Также всплыла еще одна проблема.Если я воссоздаю хранимую процедуру, отчет снова начнет прекрасно отображаться.Это нормально, за исключением того, что через короткий промежуток времени время ожидания отчета снова начинает истекать.

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

Я думаю, правильнее предположить, что основной причиной является не отчет.Это хранимая процедура, вызывающая тайм-аут при выполнении из SSRS.

Когда время снова истечет, лучшее, что я могу исправить, — это воссоздать хранимую процедуру.Кажется, это не идеальное решение.

Кажется, проблема возникает только в нашей производственной среде.Наши платформы тестирования и разработки, похоже, не сталкиваются с такой же проблемой.Хотя у разработки и тестирования не такой объем записей, как у производства.

Это было полезно?

Решение

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

  

Если вы добавляете много строк в   конец диапазона столбца (подумайте   о добавлении автономных номеров, или   метки времени), гистограмма для этого   колонка быстро устареет.   Вы можете заставить немедленное обновление от   T-SQL, выполнив ОБНОВЛЕНИЕ   СТАТИСТИКА.

Другие советы

У меня также была проблема, когда запуск SPROC занимал несколько секунд, а SSRS просто терял время ожидания.

На своем опыте я обнаружил, что существует несколько различных способов решения этой проблемы.

  1. Это прослушивание параметров!Когда ваша хранимая процедура выполняется из SSRS, она «обнюхивает» ваши параметры, чтобы увидеть, как ваш SPROC их использует.Затем SQL Server создаст план выполнения на основе своих выводов.Это хорошо при первом запуске SPROC, но вы не хотите, чтобы он делал это каждый раз, когда вы запускаете отчет.Поэтому я объявляю новый набор переменных в верхней части моего SPROC, который просто хранит параметры, переданные в запросе, и использует эти новые параметры на протяжении всего запроса.

Пример:

CREATE PROCEDURE [dbo].[usp_REPORT_ITD001]
@StartDate DATETIME,
@EndDate DATETIME,
@ReportTab INT
AS

-- Deter parameter sniffing
DECLARE @snf_StartDate DATETIME = @StartDate
DECLARE @snf_EndDate DATETIME = @EndDate
DECLARE @snf_ReportTab INT = @ReportTab

... это означает, что когда ваш SPORC выполняется SSRS, он просматривает только первые несколько строк вашего запроса на наличие переданных параметров, а не весь ваш запрос.Это значительно сокращает время выполнения в SSRS.

  1. Если ваш SPROC имеет множество временных таблиц, объявленных как переменные (DECLARE @MyTable AS TABLE), они действительно сильно нагружают сервер (с точки зрения памяти) при создании отчетов.Используя таблицы хеш-температур (SELECT MyCol1, MyCol2 INTO #MyTable) вместо этого SQL Server будет хранить ваши временные таблицы в TempDB на сервере, а не в системной памяти, что делает создание отчетов менее интенсивным.

иногда помогает добавление опции WITH RECOMPILE в оператор CREATE хранимой процедуры. Это эффективно в ситуациях, когда количество записей, исследуемых процедурой, изменяется так, что исходный план выполнения не является оптимальным.

По сути, все, что я до сих пор делал, это немного оптимизировал sproc, и, похоже, это хотя бы временно решило проблему.

Я все еще хотел бы знать, в чем разница между вызовом sproc из SSMS и SSRS.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top