【问题标题】:Query slow in SSRS but fast in SSMS在 SSRS 中查询慢,但在 SSMS 中查询快
【发布时间】:2019-02-14 08:21:41
【问题描述】:

我有以下查询:

    SELECT 
    COUNT(DISTINCT CASE WHEN ResultsA.Followup = 1 THEN ResultsA.Auditors END) as ColumnResults,
    COUNT(DISTINCT CASE WHEN ResultsA.UnannInspectionYN = 1 THEN ResultsA.Auditors END) ColumnResults2,
    COUNT(DISTINCT CASE WHEN ResultsA.UnannInspectionYN = 0 AND ResultsA.Followup = 0 THEN ResultsA.Auditors END) ColumnResults3,
    COUNT(DISTINCT ResultsA.Auditors) ColumnResults4
FROM 
    ResultsA
    INNER JOIN TableB ON TableB.Auditors = ResultsA.Auditors 
    INNER JOIN TableC ON TableC.TableCColumn = ResultsA.TableCColumn AND Country IN (@Country)
WHERE 
exists(Select SupData 
                  from IMP_SUP_DATA 
                  where impID = @id and TableC.TableCColumn = SupData)
AND
    TableB.ColumnA in ( 'Accepted and reviewed' , 'Accepted, but not reviewed', 'Submitted', 'Accepted (provisional)')
AND 
    TableB.Date BETWEEN @FromDate AND @ToDate
AND 
    ISNULL(TableC.Datainfo,'No Data') IN (@Datainfo)

查询从相当多的数据中提取,但是当我在 SSMS 中运行它时,它非常快。我可以回到几年,查询仍然最多在 10 秒内返回。 但是,当我将查询作为报告运行时,可能需要几分钟甚至在某些结果中超时。

我怎样才能以最好的方式解决这个问题?我希望从中吸取教训,以防止将来发生这种情况。环境是sql server 2014。

【问题讨论】:

  • 我用它作为原始参考,但不幸的是(可能是我)我在那里找不到结果。
  • 使用此 sql 在 SSRS 中创建数据集:DBCC USEROPTIONS,并将输出与在 SSMS 中执行的相同命令进行比较。可能在 SSMS 中启用了某些 SET 选项,而在 SSRS 连接中丢失了
  • 设置都是一样的,我刚查过..你能帮我优化一下我的查询吗?
  • 能否告诉我们您的问题是否已解决?

标签: sql-server tsql reporting-services


【解决方案1】:

OP 在评论中提到问题与 SSMS 和 SSRS 中连接的不同 SET 选项无关

首先,通过运行报表并查询目录数据库来确认问题出在数据检索操作中是有意义的:

USE ReportServer
SELECT TOP 100 ReportPath, TimeDataRetrieval, TimeProcessing, TimeRendering 
FROM dbo.ExecutionLog2
ORDER BY TimeStart desc

TimeDataRetrieval 的值应该占整个持续时间的大部分

如果是这种情况,并且具有相同参数的相同查询在 SSMS 中运行快而在 SSRS 中运行缓慢,请考虑进行此类更改:

  • 将变量的显式 CAST 添加到确切类型作为表中对应列的类型
  • 删除 WHERE 子句中的 ISNULL()
  • 添加 OPTION RECOMPILE,因为这是一个参数化的资源密集型查询

以下要评估的查询(但首先,将 CAST 调整为正确的数据类型):

SELECT 
    COUNT(DISTINCT CASE WHEN ResultsA.Followup = 1 THEN ResultsA.Auditors END) as ColumnResults,
    COUNT(DISTINCT CASE WHEN ResultsA.UnannInspectionYN = 1 THEN ResultsA.Auditors END) ColumnResults2,
    COUNT(DISTINCT CASE WHEN ResultsA.UnannInspectionYN = 0 AND ResultsA.Followup = 0 THEN ResultsA.Auditors END) ColumnResults3,
    COUNT(DISTINCT ResultsA.Auditors) ColumnResults4
FROM 
    ResultsA
    INNER JOIN TableB ON TableB.Auditors = ResultsA.Auditors 
    INNER JOIN TableC ON TableC.TableCColumn = ResultsA.TableCColumn AND Country IN (CAST(@Country AS VARCHAR(255)) )
WHERE 
EXISTS (Select SupData 
                  from IMP_SUP_DATA 
                  where impID = CAST(@id AS INT) and TableC.TableCColumn = SupData)

AND    TableB.ColumnA in ( 'Accepted and reviewed' , 'Accepted, but not reviewed', 'Submitted', 'Accepted (provisional)')

AND    TableB.Date BETWEEN CAST(@FromDate AS DATETIME) AND CAST(@ToDate AS DATETIME)
AND    ( TableC.Datainfo IN (CAST(@Datainfo AS VARCHAR(255))) OR ( CAST(@Datainfo AS VARCHAR(255))  = 'No Data' AND TableC.Datainfo IS NULL))
OPTION ( RECOMPILE)

【讨论】:

    猜你喜欢
    • 2011-11-30
    • 1970-01-01
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    相关资源
    最近更新 更多