2

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」ではそれほど時間はかかりませんでした。

みんなのフィードバックに感謝します。:-)

4

3 に答える 3

1

おそらく、そのtop 1部分が SQL Server に特に不運なクエリ プランを選択させるのでしょうか? 試す:

IF EXISTS (SELECT * FROM VIEW)

また、両方のバリアントの実際のクエリ プランのスクリーンショットを投稿すると役立ちます。

于 2013-08-19T08:06:06.697 に答える
0

を置き換えることもできます

IF EXISTS

と比較するクエリでNULL

したがって、次のようなステートメントを切り替えることも試してください。

IF EXISTS (SELECT TOP 1 * FROM VIEW)

IF (SELECT TOP 1 * FROM VIEW) IS NOT NULL

たまにお世話になった記憶があります

于 2013-08-20T09:31:32.597 に答える