2012-02-24 10 views
0

Oracleデータベースからデータを選択しているSQL Server Reporting Servicesを使用してレポートを作成しています。レポートは機能していますが、生成には長い時間がかかります(〜75秒)。SSRSレポートによるOracleデータベースのパフォーマンスの問題

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

あなたは確かにあなたが渡している制限されているパラメータを仮定して(一度

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)にファンクション索引はおそらく参考になるだけCALLテーブルを押すことで、パフォーマンスを向上させることができテーブルの行の比較的小さなサブセットと見なされる行の集合)。

SSRSとSQL * Plusのパフォーマンスの違いは、クエリプランが同じですか? SSRSレポートをトレースして、それが何を待っているのか確認できますか?

+0

+1まずこの解決策を考えてみましょう。シンプルで、どのようにクエリを設計しなければならないのですか?パフォーマンスの問題がまだ残っている場合は、他のシステムの問題(インデックスなど)を調べて、ビューやストアドプロシージャを作成してください。 – northpole

+0

+1テーブルにstart_timeとend_timeのインデックスが既にある場合、where句を 'where start_time> =:Begin_Dateとfinish time

関連する問題