ストアドプロシージャを使用して55000レコードを取得するためのSSRSレポートを作成しました。ストアドプロシージャから実行する場合はわずか3秒かかりますが、SSRSレポートから実行する場合は1分以上かかります。どうすればこの問題を解決できますか?
14 に答える
追加の時間は、データのクエリに加えて、Reporting Services がレポートをレンダリングするために発生する可能性があります。たとえば、レポートに 55,000 行が返され、レポート サーバーがそれらの行をグループ化、並べ替え、フィルター処理してレポートを表示する必要がある場合、さらに時間がかかる可能性があります。
レポートでデータがグループ化およびフィルター処理されている方法を調べてから、ストアド プロシージャを確認して、おそらくいくつかのパラメーターを使用して、その処理の一部を SQL コードにオフロードできるかどうかを確認します。レポートに返される行の量を減らして、レポートを表示するのに必要な最小値になるようにしてください。できれば、レポート自体でグループ化とフィルタリングを実行しないようにしてください。
SP でのパラメーターのスニッフィングが原因で、このような問題が発生しました。SQL Management Studio で SP を実行すると、新しい実行プランで再作成されました (呼び出しは非常に高速でした) が、レポートでは古い不適切なプランが使用され (別の一連のパラメーターに対して)、ロード時間が SQL MS よりもはるかに長くなりました。
ReportServerDB には、ExecutionLog というテーブルがあります。レポートのカタログ ID を調べて、最新の実行インスタンスを確認する必要があります。これにより、データの取得、処理、レンダリングなどにかかった時間の内訳がわかります。
SSRS パフォーマンス ダッシュボードレポートを使用して、問題をデバッグします。
明らかに、レポートを正しく実行する (つまり、SSMS と同じくらいの時間をかけてデータを選択する) ことが望ましいですが、回避策として、レポートは実行スナップショットをサポートします (つまり、パラメーターがない、またはレポートにパラメーターの既定値が保存されます)。 )?
これにより、スケジュールされたデータのスナップショットを事前に取得して保存することができます。つまり、SSRS は、ユーザーがレポートを開いたときにのみレポートを処理してレンダリングする必要があります。待機時間を数秒に短縮する必要があります (レポートに必要な処理によって異なります。YMMV、パフォーマンスが向上するかどうかをテストしてください)。
レポート マネージャーのレポートのプロパティ タブに移動し、[実行] を選択して、[レポート実行スナップショットからこのレポートをレンダリングする] に変更し、スケジュールを指定します。
レポートの要素が実行を遅くしている可能性があるかどうかを確認することをお勧めします。
たとえば、dateTimes を変換するときに実行時間に大きな違いがあることがわかりました。レポートの要素で CDate 関数を使用するものはありますか? その場合は、SQL レベルで書式設定を行うことを検討してください。
一般に、コンバージョンは大幅な速度低下を引き起こす可能性があるため、時間をかけてデータセットを調べ、何が問題なのかを確認してください。
私は同じ問題を抱えていました...それは確かにレンダリング時間でしたが、より具体的には、SORTがSSRSにあるためでした。並べ替えをストアド プロシージャに移動し、SSRS レポートから SORT を削除してみてください。55K 行では、これにより劇的に改善されます。
これは上記の回答を少し混ぜ合わせたものですが、ストアド プロシージャから最も単純で完成度の高い形式でデータを取得するために最善を尽くしてください。サーバー上ですべての並べ替え、グループ化、およびフィルター処理を行います。サーバーはこのために構築されており、レポーティング サービスにきれいな表示作業を任せるだけです。
同じ問題が発生しました。クエリは SQL で問題なく実行されましたが、SSRS では低速でした。データセットで SSRS パラメーターを使用していますか? レポート パラメーターを特定のクエリで直接使用すると、パフォーマンスが大幅に低下することがわかりました。
代わりに、データセットに @reportParam というレポート パラメーターがある場合は、次の操作を行うだけです。
declare @reportParamLocal int
set @reportParamLocal = @reportParam
select * from Table A where A.field = @reportParam
ちょっと変です。なぜそれが機能するのかはよくわかりませんが、私にとっては機能します。
SSRS レポートを高速化するための主な解決策は、レポートをキャッシュすることです。これを行う (たとえば、午前 7 時 30 分にキャッシュをプリロードする) か、ヒット時にレポートをキャッシュすると、読み込み速度が大幅に向上します。
私はこれを日常的かつ専門的に行っており、単に SSRS について詩的な話をしているわけではないことに注意してください。
SSRS でのキャッシュ http://msdn.microsoft.com/en-us/library/ms155927.aspx
キャッシュの プリロード http://msdn.microsoft.com/en-us/library/ms155876.aspx
初期レポートに時間がかかり、データが静的であることが気に入らない場合、つまり日次総勘定元帳など、データが 1 日を通して比較的静的であることを意味する場合は、キャッシュの寿命を延ばすことができます。
最後に、代わりにビジネス マネージャーがこれらのレポートを電子メール サブスクリプション経由で受信することを選択することもできます。これにより、特定の時点の Excel レポートが送信され、より簡単で体系的なものになる可能性があります。
SSRS でパラメーターを使用して、ユーザーによる簡単な解析とより高速なクエリを可能にすることもできます。パラメーター化するフィルター列の下のクエリ ビルダー タイプ IN(@SSN) で、BIDS GUI の左上のデータ ソースのすぐ上にあるパラメーター フォルダーに作成されていることがわかります。[SSRS にデータ ソース セクションが表示されない場合は、CTRL + ALT + D を押してください。
ここでほぼ同じ質問を参照してください: SSRS のパフォーマンスの問題