SSRS 2008 R2 に関するレポートを作成しています。このレポートは、データが存在する場合にのみ送信されます。最初に、ビューにデータがあるかどうかをチェックするストアド プロシージャを呼び出すデータ ドリブン サブスクリプションを作成しようとしました。その場合、定義された受信者にレポートが送信されます。ユーザーは 10 分ごとにビューを確認するように求めているため、このデータ ドリブン サブスクリプションのジョブ名を SQL Server エージェントで実行するジョブをセットアップしました。しかし、ビューを直接選択するのに約20〜30秒しかかからないにもかかわらず、サブスクリプションは常にタイムアウトすることがわかりました.
次に、この要件を満たす別の方法を考えてみました。
私が試した方法は、ビューにデータがあるかどうかを最初に確認するために SQL Server でストアド プロシージャを作成することです。その場合、SSRS 2008 R2 のレポート用に作成されたサブスクリプションのジョブ名を実行します。ビューを 10 分ごとにチェックするために、この SP を 10 分ごとに SQL Server Angent で実行するジョブを作成しました。
問題は、「IF EXISTS」で SP1 を実行するのに約 20 分かかるのに、「COUNT(*)」で SP2 を実行すると 20 秒しかかからない理由です。私はそれについて本当に混乱しています。
事前にご返信いただきありがとうございます。:)
SP1:
IF EXISTS (SELECT TOP 1 * FROM VIEW)
BEGIN
EXEC msdb.dbo.sp_start_job
@job_name = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxx'
END
--
IF EXISTS (SELECT TOP 1 C1 FROM VIEW ORDER BY C1)
BEGIN
EXEC msdb.dbo.sp_start_job
@job_name = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxx'
END
--
IF EXISTS (SELECT C1 FROM VIEW)
BEGIN
EXEC msdb.dbo.sp_start_job
@job_name = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxx'
END
SP2:
DECLARE @ExecRowCount INT
CREATE TABLE #Temp
(
C1 CHAR(50),
C2 DECIMAL(10,0),
C3 CHAR(50),
C4 VARCHAR(4)
)
INSERT INTO #Temp
SELECT * FROM VIEW
SELECT @ExecRowCount = COUNT(*) FROM #Temp
DROP TABLE #Temp
IF(@ExecRowCount > 0)
BEGIN
EXEC msdb.dbo.sp_start_job
@job_name='xxxxxxxxxxxxxxxxxxxxxxxxxxxx'
END
SP3:
IF ((SELECT COUNT(*) FROM VIEW) > 0)
BEGIN
EXEC msdb.dbo.sp_start_job
@job_name = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxx'
END
編集 2013/08/20: SP1 および SP3 @Click-Rex で試した他の句を追加しました。
申し訳ありませんが、ビューが SQL 2000 上にあることに言及するのを忘れていました。このビューの関連 DB を SQL 2008 QAS に復元して試した後、これがこの問題の根本原因です。復元後に設定を変更しませんでした。
結果: SP1 と SP3 は 1 秒未満、SP2 は 20 秒未満です。
実は、この見方はかなり複雑です。SQL 2000 で他の単純なビューを試してみました。「IF EXISTS」ではそれほど時間はかかりませんでした。
みんなのフィードバックに感謝します。:-)