SSRS报告与Oracle数据库性能问题

时间:2012-02-24 19:02:43

标签: oracle reporting-services

我正在使用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秒。我担心的是我需要添加更多查询才能完成报告,如果生成报告的基本版本需要很长时间,那么完成的报告就无法工作。如何提高报告的性能?有什么想法吗?

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

只需按一次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报告以查看它正在等待什么?

答案 1 :(得分:0)

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