論理結合の操作
このトピックでは、論理結合を作成および変更する方法について説明します。
論理結合について
論理結合は、論理表間の関係を定義します。
論理結合は概念上の結合であり、物理結合ではありません。論理結合は特定のキーまたは列を結合しません。1つの論理結合が可能な多くの物理結合に対応する場合があります。
論理結合の重要なプロパティの1つがカーディナリティです。カーディナリティは、ある表内の行が結合先の表の行とどのように関連するかを表します。1対多のカーディナリティは、最初の論理ディメンション表の各行に対応する行が、2つ目の論理表には0個、1個または多数あることを意味します。セマンティック・モデラーでは、ある表が、その他の論理表に対応しているすべての論理結合において多の側である場合、その表は論理ファクト表と見なされます。
Oracle Analytics問合せエンジンで必要なメタデータによってビジネス・モデルに対する論理リクエストがデータ・ソースに対するSQL問合せに変換されるように、論理表結合を指定する必要があります。論理結合情報によって、Oracle Analytics問合せエンジンに、論理表間の多対1関係の情報が提供されます。この論理結合情報は、Oracle Analytics問合せエンジンで基礎となるデータ・ソースに対する問合せが生成されるときに使用されます。
次の両方が当てはまる場合、論理レイヤーで論理結合を作成する必要はありません:
-
必要な物理表すべてを論理レイヤーにドラッグ・アンド・ドロップすることによって論理表を作成する。
-
論理結合が物理レイヤーの結合と同じである。
論理レイヤーでいくつかの論理結合を作成する必要が生じる場合があります。非常に単純なモデルの場合を除いて、すべての物理表を同時にドラッグ・アンド・ドロップすることはできません。
論理ダイアグラムを使用して結合を作成します。物理レイヤーで結合式を作成する場合は、式、および結合を作成する特定の列を指定できます。論理レイヤーで論理結合を作成する場合は、式も結合を作成する列も指定できません。物理レイヤーの結合は、論理レイヤーに一致する結合を必要としません。
駆動表とは
駆動表は、一方の表が非常に小さく、他方の表が非常に大きい場合に、Oracle Analytics問合せエンジンでクロスデータベース結合を処理する方法を最適化します。
駆動表の指定は、駆動表から選択された行数が結合先の表の行数よりはるかに少ない場合に、問合せの最適化につながります。
駆動表を指定した場合、Oracle Analytics問合せエンジンでは、問合せ計画で駆動表の使用によって問合せ処理が最適化されると判断された場合に駆動表が使用されます。小さな表(駆動表)がスキャンされ、パラメータ化された問合せが大きな表に発行されて一致する行が選択されます。その後で、その他の表が、その他の駆動表を含めて、一緒に結合されます。
駆動表は、内部結合に使用し、駆動表が左外部結合の左表である場合、または右外部結合の右表である場合は、外部結合に使用できます。駆動表は、完全外部結合には使用されません。
駆動表を設定することを決定するときには、次の情報に注意してください:
-
駆動表は、非常に小さい(1000行未満)場合に指定します。
-
駆動表は、マルチデータベース結合が発生する場合にのみ指定します。
-
駆動表から行が多数選択された場合、駆動表の指定によって重大なパフォーマンス低下をまねくおそれがあり、
MAX_QUERIES_PER_DRIVE_JOIN
の制限値を超えた場合は、問合せが終了します。
駆動表のパフォーマンスを制御およびチューニングする機能として、データベース機能表に2つのエントリがあります:
-
MAX_PARAMETERS_PER_DRIVE_JOIN
これは、パフォーマンス・チューニング・パラメータです。値が大きいほど、生成されるパラメータ化された問合せの数が少なくなります。値が大きすぎると、バックエンド・データベース制限によりパラメータ化問合せが失敗します。値を0 (ゼロ)に設定すると、駆動表結合がオフになります。
-
MAX_QUERIES_PER_DRIVE_JOIN
これは、リソース集中型の駆動表結合を防ぐために使用します。パラメータ化問合せの数がこの値を超えると、問合せが終了し、エラー・メッセージがユーザーに返されます。
結合トリミングを決定するもの
このトピックでは、物理問合せからトリミングできる結合をOracle Analytics問合せエンジンがどのように決定するかについて説明します。
論理表ソース内の表の結合トリミングのルールを次に示します:
-
結合の外部性(内部、左外部、右外部、または完全外部)。
-
結合カーディナリティ(結合の少なくとも片側には、不明カーディナリティを除き、9つの結合カーディナリティの組合せがあります)。
-
論理表ソースにWHERE句のフィルタが含まれているかどうか。
-
物理結合が結合と結合式のいずれであるか。
Oracle Analytics問合せエンジンは、次の基準を使用して結合をトリミングします:
-
トリミングされた表の参照は、列の予測されるリストやWHERE句の中など、問合せ内のどの場所にも存在しません。
-
トリミングされた表によって結果セットのカーディナリティが変更されることがあってはいけません。結合を削除することによって選択した行数が変更される可能性がある場合、Oracle Analytics問合せエンジンは結合をトリミングしません。
次の条件のいずれかがtrueである場合、結合には、結果セットの行数を変更する可能性があるものと見なされます。次の条件のいずれでもtrueである場合、結合は問合せからトリミングされません。
-
この結合は完全外部結合です。内部結合、左外部結合および右外部結合のみがトリミングの候補です
-
いずれかの側で結合カーディナリティが不明です。
-
トリミングする表が結合の多の側にあります。つまり、プライマリ/詳細の関係で詳細表はトリミングされません
-
トリミングする表のカーディナリティが0..1であり、結合が内部結合です。カーディナリティ0..1は、表内に一致する行が存在する可能性があることを意味します。一方の側に0..1のカーディナリティが設定されている結合は、実質的にフィルタのように機能します。選択した行数を変更しないと、Oracle Analytics問合せエンジンは表をトリミングできません。
-
トリミングする表が、左外部結合の左側、または右外部結合の右側にあり、行を維持する表は決してトリミングされません。このルールでは、DISTINCT句が問合せに追加される属性のみを選択する問合せに対して、例外が1つあります。DISTINCT句であるため、行を維持する表をトリミングしてもNull指定の表から返される行数に影響はありません。属性に対する個別の問合せの特殊なケースでは、外部結合からの行を維持する表をトリミングできます。
-
次の表に、Oracle Analytics問合せエンジンが問合せから結合をトリミングする状況の例を示します。
シナリオ | 結果 |
---|---|
![]() 従業員 内部結合 部門 |
部門は内部結合の1の側にあるため、Oracle Analytics問合せエンジンはこれをトリミングできます。 従業員は内部結合の多の側にあるため、Oracle Analytics問合せエンジンはこれをトリミングできません。 |
![]() 従業員 左外部結合 部門 |
部門は結合の1の側にあり、左外部結合の右側、Nullを指定する表にあるため、Oracle Analytics問合せエンジンはこれをトリミングできます。 従業員は多の側にあり、左外部結合の左側、行を維持する表にあるため、Oracle Analytics問合せエンジンはこれをトリミングできません。 |
![]() 従業員 右外部結合 部門 |
部門は右外部結合の右側、行を維持する表にあるため、Oracle Analytics問合せエンジンはこれをトリミングできません。 従業員は結合の多の側にあるため、Oracle Analytics問合せエンジンはこれをトリミングできません。 |
![]() 従業員 内部結合 従業員情報 |
両方の表が内部結合の1の側にあるため、Oracle Analytics問合せエンジンはいずれの側もトリミングできます。 |
![]() 従業員 左外部結合 従業員情報 |
従業員情報は結合の1の側にあり、左外部結合の右側、Nullを指定する表にあるため、Oracle Analytics問合せエンジンはこれをトリミングできます。 従業員は左外部結合の左側、行を維持する表にあるため、Oracle Analytics問合せエンジンはこれをトリミングできません。 |
![]() 従業員 右外部結合 従業員情報 |
従業員情報は右外部結合の右側、行を維持する表にあるため、Oracle Analytics問合せエンジンはこれをトリミングできます。 従業員は結合の1の側にあり、右外部結合の左側、Nullを指定する表にあるため、トリミングできます。 |
![]() 従業員 内部結合 部門 |
部門は内部結合の0..1の側にあるため、Oracle Analytics問合せエンジンはこれをトリミングできます。 従業員は内部結合の多の側にあるため、Oracle Analytics問合せエンジンはこれをトリミングできます。 |
![]() 従業員 左外部結合 部門 |
部門は外部結合の0..1の側にあり、左外部結合の右側、Nullを指定する表にあるため、Oracle Analytics問合せエンジンはこれをトリミングできます。 Oracle Analytics問合せエンジンは、外部結合の0..1の側にあるNullを指定する表をトリミングでき、その理由は、この場合は問合せから部門をトリミングしても、従業員表から選択した行数が変更されないためです。 従業員は外部結合の多の側にあるため、Oracle Analytics問合せエンジンはこれをトリミングできます。 |
![]() 従業員 完全外部結合 部門 |
結合は完全外部結合であるため、Oracle Analytics問合せエンジンはいずれの側もトリミングできません。 |
![]() 従業員 複数対複数 プロジェクト |
結合は多対多であるため、Oracle Analytics問合せエンジンはいずれの側もトリミングできません。 |
![]() 従業員 不明 部門 |
結合のカーディナリティが不明であるため、Oracle Analytics問合せエンジンはいずれの側もトリミングできません。 |
論理結合の追加および定義
論理ダイアグラムを使用して、論理表間の結合を追加および定義します。
物理レイヤーから論理レイヤーに複数の表をドラッグすると、対応する論理表および論理列が作成され、それぞれの物理結合について論理結合が自動的に作成されます。必要に応じてこれらの結合を変更したり、新しい結合を追加することができます。
「論理結合について」を参照してください。
ノート:
駆動表を指定する場合は注意してください。駆動表は、まれな状況で、駆動表が小さい(1000行未満)場合にのみ問合せの最適化に使用します。駆動表を間違って選択すると、重大なパフォーマンス低下をまねくおそれがあります。「駆動表とは」を参照してください。