Oracle® Fusion Middleware Oracle Reports ServicesレポートWeb公開ガイド 11g リリース 1 (11.1.1) B61375-02 |
|
![]() 前 |
![]() 次 |
パフォーマンス測定ツールのレポートが、データソースのデータへのアクセスに多くの時間が費やされていることを示している場合は、データ構造を再確認して、データの使用方法を決める必要があります。非効率的なスキーマ設計は、レポートのパフォーマンスに深刻な影響を及ぼします。たとえば、過度に正規化されたデータ・モデルでは、なくてもよい結合や問合せが定義されていることがあります。
この項では、レポートで使用するデータの効率性を確認し、向上させる方法について説明します。
データソースのデータを公開するには、Oracle Reportsのプラッガブル・データ・ソース・アーキテクチャを使用します。Oracle Reportsは、XML、テキスト、JDBCのプラッガブル・データ・ソースなどの非SQLデータソースをデフォルトでサポートしています。XMLおよびテキスト・プラッガブル・データソースには、どちらもリモートURLを通じてアクセスできます(ファイアウォールも通過できます)。速度が低下する場合は、データをローカルにダウンロードして、リモートURLではなくローカル・データ・ストリームを使用します。また、プロキシ・サーバーを迂回するドメインを指定することもできます。
XMLプラッガブル・データソースでは、実行時のXMLデータ検証がサポートされます。XML Queryウィザードで「検証データ・ソース」チェック・ボックスを選択すると、XMLデータがフェッチ時に、DTDまたはXMLスキーマに指定されているデータ定義に対して検証されます。これは負荷の非常に高い操作であるため、本番環境ではなく、レポートの開発時にのみ有用です。XMLデータ・ストリームが非常に大規模である場合、パフォーマンスの違いが顕著に現れます。
データ定義には、XMLスキーマまたはDTDスキーマを指定できます。XMLスキーマでは型チェックが強制されますが、DTDスキーマでは、すべてのデータが文字列として扱われるため、型チェックは必要ありません。
注意: 非SQLソースのデータ型が正しい列に対応していることを確認してください。 |
XMLデータ・ストリームにExtensible Stylesheet Language(XSL)ファイルを指定して、任意のフォーマットから単純な行セットまたは行データのフォーマットに変換できます。XSLを実行時に適用しない場合は、データを最初から適切なフォーマットで保持しておくことをお薦めします。
プラッガブル・テキスト・データソースでは、セルの囲み文字の使用がサポートされます。これにより、囲みが定義されている各フィールドで、ファイル・フォーマット・レベルのデリミタが無視されます。セルの囲みは、本当に必要でないかぎり使用しないでください。
JDBCプラッガブル・データソースでは、JDBCブリッジ、Thick JDBCドライバおよびThin JDBCドライバがサポートされます。ドライバの選択は、データのフェッチに直接影響します。この選択は、使用されているアプリケーションとデータベースにより決まります。一般に、ネイティブなドライバを使用したほうが、パフォーマンスはよくなります。詳細は、第14章「プラッガブル・データ・ソースの構成と使用」を参照してください。
SQLのWHERE句で使用する列には、索引を作成してください。レポートのマスター問合せにある列に対する索引は、それほど効果がないかもしれません。なぜならこれらの問合せでは、データベースへのアクセスは1回のみだからです。パフォーマンスを大きく向上させるには、ディテール問合せで結合されているすべての列で索引を使用するようにします。
注意: 適切な索引がない場合は、全表スキャンの回数が多くなり、結果的にパフォーマンスが悪化します。 |
レポート内では、サマリー列や式列による計算のほとんどを、データソースで実行するようにします。SQL問合せの場合、計算は、レポートで取り出したデータに対してではなく、データベースで実行されます。データベースに格納されているユーザー定義ファンクションおよびプロシージャを、Oracle DatabaseまたはJDBC問合せの問合せ選択リストに含めることもできます。この場合、結果セットの一部としてデータベースから計算されたデータが返されるため、ローカル・ファンクションを使用するよりも効率的です。
例
次のPL/SQLファンクションを、Oracle Databaseに格納するとします。
CREATE OR REPLACE FUNCTION CityState (
p_location_id world_cities.location_id%TYPE) RETURN VARCHAR2 is v_result VARCHAR2(100);
BEGIN
SELECT city || ','||state
INTO v_result FROM world_cities
WHERE location_id = p_location_id; RETURN v_result;
END CityState;
このファンクションは、都市名とその州名を、カンマとスペースで区切って返します。このフォーマットはデータベース・レベルで実行され、結果のみがレポートに返されて表示されます。
レポートでは、次のようなSQL問合せを使用します。
SELECT location_id, citystate(location_id)"City & State" FROM world_cities
結果は次のようになります。
LOCATION_ID CITY & STATE ----------- ------------------------- 1 Redwood Shores, California 2 Seattle, Washington 3 Los Angeles, California 4 New York, New York
レポートの問合せでは、必要な列のみを選択することが理想的です。問合せが少なければ少ないほど、レポートの実行は高速になります。単一問合せによるデータ・モデルは、複数問合せによるデータ・モデルよりも高速に実行されます。しかし、レポートで、ユーザーごとに別々のフォーマットを使い分けるだけでなく、異なる問合せ文を使用することが必要になるケースもあります。この問題は2種類の異なるレポートを作成することで解決されますが、メンテナンスを容易にするには1つのレポートを保持するほうが望ましいことは明らかです。この場合は、SRW.SET_MAXROW
ビルトイン・プロシージャを使用して、冗長な問合せを無効にします。
注意: SRW.SET_MAXROW ビルトイン・プロシージャを含むSRW ビルトイン・パッケージの詳細は、Oracle Reportsのオンライン・ヘルプを参照してください。 |
例
Before Reportトリガーに使用されている次のコードでは、ユーザー・パラメータに応じて、Query_Emp
またはQuery_Dept
のいずれかが無効になります。
IF :Parameter_1 = 'A' THEN
SRW.SET_MAXROW('Query_Emp',0);
ELSE
SRW.SET_MAXROW('Query_Dept',0);
END IF;
XMLまたはテキスト・プラッガブル・データソースのいずれかに基づいて問合せを定義するには、問合せで使用するフィールド(使用可能なすべてのフィールドまたはサブセット)を選択します。フィールドのサブセットを使用する必要がある場合は、すべての値をフェッチしてからグループ・フィルタやレイアウト・レベルのフォーマット・トリガーを使用してフィルタリングを行うのではなく、パラメータを使用して問合せレベルでサブセットを使用します。
ブレーク・グループの数を制限して、レポートのパフォーマンスを向上させます。Oracle Reportsでは、最下位レベルの子グループを除き、ブレーク順序プロパティが設定されているデータ・モデルの各列にブレーク・レベルが設定されます。
SQL問合せでは、Oracle Reportsによって、この設定が追加の列として問合せのORDER BY句に追加されます。ORDER BY句にある列の数が少ないほど、データを必要な順序に並べ替えて返すためのデータベース操作が少なくて済みます。ブレーク・グループの作成は、問合せの一部として定義されているORDER BY句を無視して、ORDER BY句を冗長にする場合があります。こうしたORDER BY句は、データベースで余分な処理が必要となるため削除してください。
レポートでブレーク・グループを使用する必要がある場合は、「ブレーク順序」プロパティを設定する列を極力少なくします。ブレーク順序列には、Reports Builderのデータ・モデル・ビューで、グループ内の列名の左に小さな矢印が表示されています。問合せの最下位レベルの子グループを除く各ブレーク・グループでは、少なくとも1つの列に、「ブレーク順序」プロパティを設定する必要があります。ソートが必要ない列でブレーク・グループを解除すると、パフォーマンスが向上します。
ブレーク・グループは、可能であれば1列に限定します。これらの列はできるだけ小さくすると同時に、可能であればデータベース列(サマリー列や式列ではなく)にします。これらの両条件は、データがフォーマットされる前にOracle Reportsにより実行されるローカル・キャッシングを最大限に効率化することに役立ちます。これらの条件は常に満たされるとはかぎりませんが、条件が満たされる場合に適用すると、パフォーマンスは確実に向上します。
グループ・フィルタは、表示されるレコードの数を減らすために使用されます。問合せがデータソースからOracle Reportsにデータを返した後に、フィルタリングは実行されます。上位5レコードのみを表示するようにフィルタを定義していても、結果セットには、問合せによって返されたすべてのレコードが含まれます。そのため、グループ・フィルタ機能を問合せのWHERE
句または「最大行数」プロパティに組み込むと、効率性が高くなります。これにより、データベースから返されるデータを制限できます。
複数の表からなるデータ・モデルを作成する方法は多数あります。企業の各部門に所属する全従業員を一覧表示するレポートを作成する場合に、deptとempを結合する標準的なケースを考えてみます。次のいずれかの問合せを作成できます。
単一問合せ:
SELECT d.dname, e.ename FROM emp e, dept d WHERE e.deptno(+) = d.deptno
deptno
に基づく列リンクを使用する2つの問合せ:
SELECT deptno, dname FROM dept SELECT deptno, ename FROM emp
レポートのデータ・モデルを設計するときは、単純な単一表問合せを多数作成するのではなく、大きな複数表問合せを少数作成することで、問合せの数を少なくします。Oracle Reportsでは、問合せが実行されるたびに、解析、バインドおよびカーソルが実行されます。単一問合せによるレポートでは、必要なすべてのデータが、複数のカーソルではなく1つのカーソルで返されます。マスター・ディテール問合せでは、取り出された各マスター・レコードに対して、再度、ディテール問合せが解析、バインドおよび実行されます。この例では、2つの問合せをマージし、ブレーク・グループを使用してマスター・ディテール効果を作成したほうが効率的です。
問合せがより大きく複雑になるほど、メンテナンスが難しくなることに注意してください。パフォーマンスとメンテナンスの要件間のバランスを、どの時点で取るかを決める必要があります。