2016-12-16 52 views
3

我有一份關於具有14個子報告的SSRS的報告。所有這些子報表都從相同的存儲過程中讀取,但以不同的方式顯示數據(因爲計算不同)。我已經寫了SP的方式如下: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

數據多久改變一次?如果這是通過夜間批處理完成的,那麼也許您可以製作常規表格而不是臨時表格,並在晚上批量處理數據?然後讓SP看看這些表格,而不是創建臨時表格。 – steenbergh

+0

這不是作爲一個ETL過程來完成的,臨時表只是永久表(這是醫療聲明,所以有數百萬和數百萬行)的摘錄。臨時工是一種減少對永久表進行讀取的方法。它們不能是永久的,因爲報告具有日期參數。 – raltandi

回答

1

您可以創建另一個表(控制表),其中包含一行,其中包含兩列 - 臨時表的開始日期和結束日期。當每個報告開始時,它應該檢查當前日期與控制表中的日期。如果日期不是當前重建臨時表,否則只是繼續處理。如果您正在創建將以這種方式共享的臨時表,那麼您可能不希望僅創建常規表的臨時表。

另一種方法是運行SQL Server作業,每天晚上在午夜重建工作表。

順便說一下,您可以在臨時表上創建索引,並且應該認真考慮向臨時表中添加聚簇索引。即使是「小」表,您也可能發現對這樣的表運行速度要快得多。

1

由於您使用的是單獨的子報表,因此每個查詢的查詢都不會使用臨時表所在的同一個事務。當查詢連接丟失時,SQL Server將丟棄這些表。

您可以嘗試將所有子報表合併爲一個。如果您檢查數據源中的Use Single Transaction框,它們將允許您爲每個查詢使用#TEMP表。

另一個是將使用全球臨時表 - ## TEMP。全局臨時表不會自動丟棄,並且可以被其他子報表使用。

+0

我嘗試將所有子報表合併爲一個並檢查該複選框,但仍需要很長時間。我也想過使用全局臨時表,但是如果其他人同時打開報表,那麼不會產生衝突嗎? – raltandi

+0

我在共享SSRS中的全局臨時文件,並沒有問題這樣做。 –