我正在使用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语句从来都不是一个好主意。如果你能找到一种方法来删除这些(比如调用一个函数),你可能会看到一些额外的性能提升。