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

Oracle数据库性能问题的SSRS报告,oracle,reporting-services,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 tota

我正在使用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
现在我可以在Oracle中使用SQLPlus*执行这个查询,当然,它会在8秒内执行。当我尝试在SSRS报告中执行相同的查询时,生成该查询需要75秒。我担心的是,我需要添加更多的查询来完成报告,如果仅仅生成报告的这个基本版本就需要这么长时间,那么完成的报告将无法工作。如何提高报告的性能?有什么想法吗


提前感谢您的帮助。

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

您当然可以通过只点击一次调用表来提高性能

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
此外,基于TRUNCstart_time和truncsfinish_time的函数索引可能会有所帮助,前提是您传入的参数将要考虑的行集限制为表中相对较小的行子集


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

+1我会先用这个解决方案。这很简单,并且说明了应该如何设计查询。如果仍然存在性能问题,则开始研究其他系统问题,如索引,可能会创建视图或存储过程。+1如果表已在开始时间和结束时间上具有索引,则如果where子句修改为where start\u time>=:Begin\u Date和FINICE time<截止日期:结束日期+1。