3

更新:申し訳ありません!古い説明のせいで誤解を招いてしまったかもしれません。移行直後は問題がなく、移行の 1 週間後に問題が発生し始めました

最近、データベースとレポート サーバーを新しいデータベース サーバーと新しいレポート サーバーに移行しました。

以前の構成:

  • データベース サーバー: 2008 Enterprise、DB01/NamedInstance
  • レポート サーバー: データベース サーバーと同じサーバー、ネイティブ モード、データベース資格情報は NT AUTHORITY\NETWORK SERVICE

現在の構成:

  • データベース サーバー: 2012 Enterprise、DC01 (既定のインスタンス、名前付きインスタンスではありません)
  • Reporting Services: RP01 (ネイティブ モード) に移動、データベース資格情報は SQL アカウント(sa)

移行は MSDN の移行手順に従っており、最終的に機能します (ただし、冗長なスケールアウト展開サーバー (古いサーバーと同じ名前) を手動で削除して機能させる必要がありましたが、これは SSRS のバグだと思います)。

移行の 1 週間後、新しいレポート サーバーでレポートの実行が非常に遅くなり始めました。

そこで、次の分析を行いました。

  1. 古いレポート サーバー (レポートのデータベース接続が新しいデータベース サーバーを指す) と新しいレポート サーバーでレポートを実行すると、古いレポート サーバーは以前と同じように高速に実行されます (1 秒) が、新しいレポート サーバーの実行は非常に遅くなります (31 2番目)。

  2. レポートが呼び出すストアド プロシージャを直接実行します。以前と同様に非常に高速です (50 ミリ秒)。

  3. 診断 [ReportServer$Instance].[dbo].[ExecutionLog] データベース、TimeDataRetrival は古いサーバーでは 50 ミリ秒ですが、新しいサーバーでは 30050 ミリ秒です。

  4. SQL Server プロファイラーを実行し、古いサーバーでレポートを実行すると、すべて問題ないようです。新しいサーバーでレポートを実行すると、何かが気になりました。各バッチの最後のイベントの後、「監査ログアウト」が生成される前に、長時間「ハング」(実行) します。以下のサンプルは実際には 10 秒間実行されますが、すべてのステートメントは実際には 1 秒未満実行されます。

  5. 私はそれを疑っています:a)。アカウント アクセスなどの一部の構成が、私の承認なしに変更されました。b)。新しいレポート サーバーは、適切なアクセス権を持っていないユーザーを認証しようとしており、別の解決策の前に数秒間「ハング」しています。

プロファイラー出力の開始:


監査ログイン -- ネットワーク プロトコル: TCP/IP set quoted_identifier on set arithabort off set numeric_roundabort off set ansi_warnings on set ansi_padding on set ansi_nulls on set concat_null_yields_null on set cursor_close_on_commit off set implicit_transactions off set language us_english set dateformat mdy set datefirst 7 set transaction isolation levelコミットされた読み取り

レポート サーバー sa 1440 100 2013-04-16 16:10:14.393 0X2000002838F4010000000000


SQL:BatchStarting は
@BatchID uniqueidentifier を宣言します

                                        set @BatchID = NEWID()

                                        UPDATE [Event] WITH (TABLOCKX)
                                            SET [BatchID] = @BatchID,
                                            [ProcessStart] = GETUTCDATE(),
                                            [ProcessHeartbeat] = GETUTCDATE()
                                        FROM (
                                            SELECT TOP 8 [EventID] FROM [Event] WITH (TABLOCKX) WHERE [ProcessStart] is NULL ORDER BY [TimeEntered]
                                            ) AS t1
                                        WHERE [Event].[EventID] = t1.[EventID]

                                        select top 8
                                            E.[EventID],
                                            E.[EventType],
                                            E.[EventData]
                                        from
                                            [Event] E WITH (TABLOCKX)
                                        where
                                            [BatchID] = @BatchID
                                        ORDER BY [TimeEntered]

レポート サーバー sa 1440 100 2013-04-16 16:10:14.393


SQL:BatchCompleted
は @BatchID uniqueidentifier を宣言します

                                        set @BatchID = NEWID()

                                        UPDATE [Event] WITH (TABLOCKX)
                                            SET [BatchID] = @BatchID,
                                            [ProcessStart] = GETUTCDATE(),
                                            [ProcessHeartbeat] = GETUTCDATE()
                                        FROM (
                                            SELECT TOP 8 [EventID] FROM [Event] WITH (TABLOCKX) WHERE [ProcessStart] is NULL ORDER BY [TimeEntered]
                                            ) AS t1
                                        WHERE [Event].[EventID] = t1.[EventID]

                                        select top 8
                                            E.[EventID],
                                            E.[EventType],
                                            E.[EventData]
                                        from
                                            [Event] E WITH (TABLOCKX)
                                        where
                                            [BatchID] = @BatchID
                                        ORDER BY [TimeEntered]
                                            Report Server       sa  0   7   0   0   1440    100 2013-04-16 16:10:14.393 2013-04-16 16:10:14.393     

SQL:BatchStarting は
@BatchID uniqueidentifier を宣言します

                                set @BatchID = newid()

                                UPDATE [Notifications] WITH (TABLOCKX)
                                    SET [BatchID] = @BatchID,
                                    [ProcessStart] = GETUTCDATE(),
                                    [ProcessHeartbeat] = GETUTCDATE()
                                FROM (
                                    SELECT TOP 8  [NotificationID] FROM [Notifications] WITH (TABLOCKX) WHERE ProcessStart is NULL and
                                    (ProcessAfter is NULL or ProcessAfter < GETUTCDATE()) ORDER BY [NotificationEntered]
                                ) AS t1
                                WHERE [Notifications].[NotificationID] = t1.[NotificationID]

                                select top 8
                                        -- Notification data
                                        N.[NotificationID],
                                        N.[SubscriptionID],
                                        N.[ActivationID],
                                        N.[ReportID],
                                        N.[SnapShotDate],
                                        N.[DeliveryExtension],
                                        N.[ExtensionSettings],
                                        N.[Locale],
                                        N.[Parameters],
                                        N.[SubscriptionLastRunTime],
                                        N.[ProcessStart],
                                        N.[NotificationEntered],
                                        N.[Attempt],
                                        N.[IsDataDriven],
                                        SUSER_SNAME(Owner.[Sid]),
                                        Owner.[UserName],
                                        -- Report Data
                                        O.[Path],
                                        N.[ReportZone],
                                        O.[Type],
                                        SD.NtSecDescPrimary,
                                        N.[Version],
                                        Owner.[AuthType]
                                    from 
                                        [Notifications] N with (TABLOCKX) inner join [Catalog] O on O.[ItemID] = N.[ReportID]
                                        inner join [Users] Owner on N.SubscriptionOwnerID = Owner.UserID
                                        left outer join [SecData] SD on O.[PolicyID] = SD.[PolicyID] AND SD.AuthType = Owner.AuthType
                                    where 
                                        N.[BatchID] = @BatchID
                                ORDER BY [NotificationEntered]

レポート サーバー sa 1440 100 2013-04-16 16:10:14.393


SQL:BatchCompleted
は @BatchID uniqueidentifier を宣言します

                                set @BatchID = newid()

                                UPDATE [Notifications] WITH (TABLOCKX)
                                    SET [BatchID] = @BatchID,
                                    [ProcessStart] = GETUTCDATE(),
                                    [ProcessHeartbeat] = GETUTCDATE()
                                FROM (
                                    SELECT TOP 8  [NotificationID] FROM [Notifications] WITH (TABLOCKX) WHERE ProcessStart is NULL and
                                    (ProcessAfter is NULL or ProcessAfter < GETUTCDATE()) ORDER BY [NotificationEntered]
                                ) AS t1
                                WHERE [Notifications].[NotificationID] = t1.[NotificationID]

                                select top 8
                                        -- Notification data
                                        N.[NotificationID],
                                        N.[SubscriptionID],
                                        N.[ActivationID],
                                        N.[ReportID],
                                        N.[SnapShotDate],
                                        N.[DeliveryExtension],
                                        N.[ExtensionSettings],
                                        N.[Locale],
                                        N.[Parameters],
                                        N.[SubscriptionLastRunTime],
                                        N.[ProcessStart],
                                        N.[NotificationEntered],
                                        N.[Attempt],
                                        N.[IsDataDriven],
                                        SUSER_SNAME(Owner.[Sid]),
                                        Owner.[UserName],
                                        -- Report Data
                                        O.[Path],
                                        N.[ReportZone],
                                        O.[Type],
                                        SD.NtSecDescPrimary,
                                        N.[Version],
                                        Owner.[AuthType]
                                    from 
                                        [Notifications] N with (TABLOCKX) inner join [Catalog] O on O.[ItemID] = N.[ReportID]
                                        inner join [Users] Owner on N.SubscriptionOwnerID = Owner.UserID
                                        left outer join [SecData] SD on O.[PolicyID] = SD.[PolicyID] AND SD.AuthType = Owner.AuthType
                                    where 
                                        N.[BatchID] = @BatchID
                                ORDER BY [NotificationEntered]

レポート サーバー sa 0 7 0 0 1440 100 2013-04-16 16:10:14.393 2013-04-16 16:10:14.393


監査ログアウト
レポート サーバー sa 0 3836 6 10140 1440 100 2013-04-16 16:10:14.393 2013-04-16 16:10:24.533

4

2 に答える 2

1

式からパラメーター スニッフィングを排除しましたか?

SSRS での高速クエリの実行が遅い

一致する偽のパラメーターを sproc に追加してから、最初に対応するパラメーターによって渡された値を指定してみてください。その方法でレポートがより速く実行されるかどうかを確認してください。

于 2013-04-17T00:19:01.610 に答える
1

わかりました、私はそれを解決する方法を考え出したと思います。レポート ファイル (.rdl) を変更し、新しいレポート サーバーにアップロードして既存のファイルを上書きしました。期待どおりに高速に動作しています。

データベースのバックアップ/復元を使用して SSRS 2008 を SSRS 2012 に移行したため、SSRS 2012 がファイル形式を自動的にアップグレードしなかったため、問題が発生したと思われます。

于 2013-04-18T04:49:31.710 に答える