2012-02-24 51 views
0

我正在使用从Oracle数据库中选择数据的SQL Server Reporting Services创建报告。报告正在工作,但需要很长时间才能生成(〜75秒)。我已经在我的报告非常简单的查询如下:带有Oracle数据库性能问题的SSRS报告

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

在此先感谢您的帮助。

回答

0

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

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报告,看看它在等待什么吗?

+0

+1我会先用这个解决方案。这很简单,你应该如何设计你的查询。如果您仍然遇到性能问题,那么请开始查看其他系统问题(如索引),并可能创建视图或存储特效。 – northpole 2012-02-24 19:16:03

+0

+1如果表已经有start_time和end_time上的索引,那么查询应该能够使用它,如果where子句修改为'where start_time> =:Begin_Date并且结束时间 2012-02-25 08:09:15