2016-12-16 6 views
3

У меня есть отчет о SSRS, который имеет 14 подзаголовков. Все эти подзаголовки считываются из одной и той же хранимой процедуры, но представляют данные по-разному (из-за разных вычислений). Способ, которым я записал СП, выглядит следующим образом:SSRS - Повторное использование временной таблицы в нескольких наборах данных

IF OBJECT_ID('tempdb.dbo.#blabla') IS NOT NULL 
    BEGIN DROP TABLE #blabla END 
SELECT a,b,c,d,e 
INTO #blabla 
WHERE a='bla' 

IF @type = 1 --report 1 
    BEGIN 
     SELECT .... 
    END 
IF @type = 2 --report 2 
    BEGIN 
     SELECT ..... 
    END 

И так далее для каждого отчета.

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

+1

Как часто изменяются данные? Если это делается с ночной периодичностью, возможно, вы могли бы создавать обычные таблицы вместо временных таблиц и помещать данные там в ночной пакет? Затем вместо того, чтобы создавать временные параметры, вы можете увидеть их в этих таблицах. – steenbergh

+0

Это не сделано как процесс ETL, таблицы temp - это просто выдержки из постоянных таблиц (которые являются медицинскими утверждениями, поэтому есть миллионы и миллионы строк). Темпс - это способ минимизировать чтение в постоянных таблицах. Они не могут быть постоянными, поскольку в отчете есть параметры даты. – raltandi

ответ

1

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

Другой подход заключается в выполнении задания SQL Server, которое каждую ночь в полночь перестраивает рабочий стол.

Кстати, вы можете создавать индексы на временных таблицах, и вам следует серьезно подумать о добавлении кластерного индекса в таблицу temp. Вы можете обнаружить, что у вас намного быстрее результаты против такой таблицы, даже если это «маленькая» таблица.

1

Поскольку вы используете отдельные подзаголовки, запросы для каждого из них не будут использовать ту же транзакцию, где находятся таблицы temp. SQL Server отбрасывает таблицы, когда соединение для запроса теряется.

Вы можете попробовать объединить все свои вложенные отчеты в один. Они позволят вам использовать таблицы #TEMP для каждого запроса, если вы проверите поле Use Single Transaction в источнике Datasource.

Другим было бы использование глобальных таблиц температуры - ## TEMP. Глобальные таблицы Temp не получают автоматическое отбрасывание и могут использоваться другими подписями.

+0

Я попытался объединить все вложенные записи в один и проверить этот флажок, но он по-прежнему занимает слишком много времени. Я также думал об использовании глобальных таблиц тем, но не создавал бы конфликтов, если бы кто-то другой открыл отчет одновременно? – raltandi

+0

Я поделился глобальными временными файлами в SSRS и не имел проблем с этим. –