【问题标题】:SQL Server Reporting Services very slow after migration迁移后 SQL Server Reporting Services 非常慢
【发布时间】:2013-04-16 06:56:06
【问题描述】:

更新:对不起!由于旧的描述,我可能误导了你。迁移后问题不存在,迁移后 1 周开始出现

我们最近将数据库和报表服务器迁移到了新的数据库服务器和新的报表服务器。

之前的配置:

  • 数据库服务器:2008 Enterprise,DB01/NamedInstance
  • 报表服务器:与数据库服务器相同的服务器,本机模式,数据库凭据为 NT AUTHORITY\网络服务

现在的配置:

  • 数据库服务器:2012 Enterprise,DC01(默认实例,未命名 实例)
  • Reporting Services:移至 RP01(本机模式),数据库 凭据是 SQL 帐户(sa)

迁移遵循 MSDN 迁移说明并最终运行(尽管我们必须手动删除冗余的横向扩展部署服务器(与旧服务器同名)以使其正常运行,我认为这是 SSRS 错误)。

迁移 1 周后,新报表服务器上的报表开始运行异常缓慢。

于是我做了如下分析:

  1. 在旧报表服务器(报表的数据库连接指向新数据库服务器)和新报表服务器中执行报表,旧报表服务器运行速度和以前一样快(1秒),但新报表服务器运行速度极慢(31 秒)。

  2. 直接执行报表调用的存储过程,速度和以前一样快(50毫秒)。

  3. 诊断 [ReportServer$Instance].[dbo].[ExecutionLog] 数据库,TimeDataRetrival 在旧服务器中为 50 毫秒,但在新服务器中为 30050 毫秒。

  4. 运行 SQL Server Profiler,在旧服务器上执行报告,一切正常。在新服务器上执行报告,引起了我的注意。在每批的最后一个事件之后,它会“挂起”(运行)很长时间,然后才会生成“审计注销”。下面的示例实际运行了 10 秒,但所有语句实际运行了不到 1 秒。

  5. 我怀疑:a)。某些配置(例如帐户访问权限)已在未经我确认的情况下更改。乙)。新的报表服务器正在尝试对没有适当访问权限的用户进行身份验证,并在替代解决方案之前“挂起”几秒钟。

分析器输出开始:


审核登录 -- 网络协议:TCP/IP 设置quoted_identifier on 关闭 arithabort 设置 numeric_roundabort 关闭 设置 ansi_warnings on 设置 ansi_padding 设置 ansi_nulls 将 concat_null_yields_null 设置为 设置 cursor_close_on_commit 关闭 设置implicit_transactions 关闭 设置语言 us_english 设置日期格式 mdy 设置日期优先 7 设置事务隔离级别读取提交

报表服务器 sa 1440 100 2013-04-16 16:10:14.393 0X2000002838F4010000000000


SQL:BatchStarting
声明@BatchID 唯一标识符

                                        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:批量完成
声明@BatchID 唯一标识符

                                        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 唯一标识符

                                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:批量完成
声明@BatchID 唯一标识符

                                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

【问题讨论】:

    标签: sql-server ssrs-2008 reporting-services


    【解决方案1】:

    您是否从方程式中消除了参数嗅探?

    Fast query runs slow in SSRS

    尝试将匹配的假参数添加到存储过程中,然后在开始时为它们提供相应参数传入的值。看看报告是否以这种方式运行得更快。

    【讨论】:

    • 1.这里的场景是报表没有变化,在旧报表服务器上运行良好,但在新报表服务器上运行缓慢。 2. SP已经有局部变量来避免嗅探
    • 我知道报告没有改变,SQL Server 的每个实例都可以根据硬件和设置采取不同的行动。你是说运行 SSRS 服务的服务器发生了变化,但托管数据库的服务器没有变化?
    • 您是否尝试添加 OPTION(RECOMPILE) 或其他提示?
    • 之前:report+db 在同一个服务器上,现在:report server 与 db server 不同。测试:旧报表服务器指向新数据库服务器,新报表服务器指向新数据库服务器。旧报表服务器速度快,新报表服务器速度慢。我已经添加了重新编译选项
    【解决方案2】:

    好的,我想我知道如何解决它了。我修改了报告文件 (.rdl) 并上传到新的报告服务器以覆盖现有的,它运行速度符合预期。

    我怀疑是因为我们使用数据库备份/恢复将 SSRS 2008 迁移到 SSRS 2012,而 SSRS 2012 没有自动升级文件格式,导致了问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多