2016-12-16 4 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

データはどのくらいの頻度で変更されますか?これが夜間のバッチで行われた場合、おそらく、一時テーブルの代わりに通常のテーブルを作成し、夜間のバッチにデータを置くことができますか?次に、tempsを作成する代わりに、これらのテーブルにSPの外観を表示します。 – steenbergh

+0

これはETLプロセスとして行われていません。一時表は永続表から抽出されたものです(医学的な主張であるため、何百万と何百万行もあります)。テンポは永久テーブルへの読み込みを最小限にする方法です。レポートに日付パラメータが設定されているため、永続的にすることはできません。 – raltandi

答えて

1

一時テーブルの開始日と終了日の2つの列を含む1つの行を含む別のテーブル(制御テーブル)を作成できます。各レポートが開始されると、現在の日付を制御テーブルの日付と照合する必要があります。日付が最新でない場合は、一時テーブルを再構築します。それ以外の場合は処理を続行します。この方法で共有される一時テーブルを作成する場合は、おそらく通常のテーブルだけの一時テーブルを作成する必要はありません。

もう1つの方法は、毎晩午前0時に作業テーブルを再構築するSQL Serverジョブを実行することです。

ただし、一時テーブルにインデックスを作成することはできますが、クラスタ化インデックスをtempテーブルに追加することを真剣に検討する必要があります。そのようなテーブルに対して実行される結果が、小さなテーブルであっても、はるかに速いことがわかります。

1

個別のサブレポートを使用しているため、それぞれのクエリは、テンポラリテーブルと同じトランザクションを使用しません。 SQL Serverは、クエリの接続が失われたときにテーブルを削除します。

すべてのサブレポートを1つにまとめることができます。 データソースUse Single Transactionボックスをチェックすると、クエリごとに#TEMPテーブルを使用できるようになります。

もう1つは、グローバル温度テーブル - ## TEMPです。グローバル温度テーブルは自動的に削除されず、他のサブレポートでも使用できます。

+0

すべてのサブレポートを1つにまとめてみて、そのボックスをチェックしようとしましたが、それでも時間がかかりました。私はGlobal Temp Tablesの使用についても考えましたが、同時に他の人が同時にレポートを開いた場合、競合を起こさないでしょうか? – raltandi

+0

私はSSRSでグローバルな一時ファイルを共有しており、問題は発生していません。 –

関連する問題