2012-02-24 50 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