我正在使用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秒。我担心的是我需要添加更多查询才能完成报告,如果生成报告的基本版本需要很长时间,那么完成的报告就无法工作。如何提高报告的性能?有什么想法吗?
提前感谢您的帮助。
答案 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语句绝不是一个好主意。如果你能找到一种方法来删除这些(比如调用一个函数),你可能会看到一些额外的性能提升。