SSRS报告Oracle数据库性能问题



我正在使用SQL Server Reporting Services创建一个报告,该服务从Oracle数据库中选择数据。该报告正在工作,但生成该报告需要很长时间(约75秒)。我的报告中有以下非常简单的查询:

SELECT  
(SELECT   COUNT(*)  
   FROM   CALL  
  WHERE   trunc(start_time) >= :Begin_Date 
    AND   trunc(finish_time) <=  :End_Date) AS total_calls,
(SELECT   COUNT(*)  
   FROM   CALL  
  WHERE   DISCONNECT = 'T' 
    AND   trunc(start_time) >= :Begin_Date 
    AND   trunc(finish_time) <=  :End_Date) AS transfered_calls,
(SELECT   COUNT(*)  
   FROM   CALL  
  WHERE   DISCONNECT = 'H' 
    AND   trunc(start_time) >=  :Begin_Date 
    AND   trunc(finish_time) <=  :End_Date) AS hangups
FROM DUAL

现在我可以使用SQLPlus*在Oracle中执行这个查询了(当然要填写日期),它在大约8秒内执行。当我尝试在SSRS报告中执行相同的查询时,生成该查询需要75秒。我担心的是,我需要添加更多的查询来完成报告,如果仅仅生成这个基本版本的报告就需要很长时间,那么完成的报告就不可能工作。如何提高报告的性能?有什么想法吗?

提前感谢您的帮助。

只需点击CALL表一次,就可以提高性能

SELECT COUNT(*) total_calls,
       SUM(CASE WHEN disconnect = 'T'
                THEN 1
                ELSE 0
             END) transferred_calls,
       SUM(CASE WHEN disconnect = 'H'
                THEN 1
                ELSE 0
              END) hangups
  FROM call
 WHERE trunc(start_time)  >= :Begin_Date
   AND trunc(finish_time) <= :End_Date

此外,基于TRUNC(start_time)TRUNC(finish_time)的函数索引可能会有所帮助(假设传入的参数将考虑的行集限制为表中相对较小的行子集)。

至于SSRS和SQL*Plus之间的性能差异,查询计划是否相同?你能追踪SSRS报告,看看它在等什么吗?

几个建议。首先,请确保您的表已正确编制索引,以便可以使用Oracle Optimizer。当我做这些类型的报告时,我发现如果我创建一个视图来获得我需要的数据,它会运行得更好。您也可以创建一个存储过程来执行同样的操作。我两者都用过,从中我得到了很好的效果。此外,在select子句中使用嵌入的select语句从来都不是一个好主意。如果你能找到一种方法来删除这些(比如调用一个函数),你可能会看到一些额外的性能提升。

最新更新