集計ナビゲーションの断片化の操作

このトピックには、データの断片化を指定するためのテクニックとルールを示す例が含まれています。

「論理表ソースのデータ断片化の定義」を参照してください。

単一列の値ベースの述語のための断片化の指定

IN述語は、1つの等価述語、またはOR結合で区切られた複数の等価述語で置き換えることができます。

断片1:

logicalColumn IN <valueList1>

断片n:

logicalColumn IN <valueListN>

単一列の範囲ベースの述語のための断片化の指定

>=述語および<述語を使用して、断片の内容の記述が重ならないようにしてください。各断片では、上限値を<として表す必要があります。<=を使用すると、エラーが発生します。BETWEEN述語を使用して断片の範囲の内容を記述することはできません。

断片1:

logicalColumn >= valueof(START_VALUE) AND logicalColumn < valueof(MID_VALUE1)

断片2:

logicalColumn >= valueof(MID_VALUE1) AND logicalColumn < valueof(MID_VALUE2)

断片n:

logicalColumn >= valueof(MID_VALUEN-1) AND logicalColumn < valueof(END_VALUE)

開始点、中間点、終了点は注意深く選択してください。

ここで参照されるvalueofはセマンティック・モデル変数の値です。式の中でセマンティック・モデル値を使用する場合、次の構文は断片2に対して動作しません:

logicalColumn >= valueof(MID_VALUE1)+1 AND logicalColumn < valueof(MID_VALUE2)

valueof(MID_VALUE1)+1のかわりに別のセマンティック・モデル変数を使用します。

同じ変数(たとえばvalueof(MID_VALUE1))が両方の断片の内容に含まれている必要はありません。別の変数を設定し、次の形式の文を作成することができます。

断片1:

logicalColumn >= valueof(START_VALUE) AND logicalColumn < valueof(MID_VALUE1)

断片2:

logicalColumn >= valueof(MID_VALUE2) AND logicalColumn < valueof(MID_VALUE3)

複数列のコンテンツ記述の指定

各コンテンツ・フィルタには、異なる列に任意の数の述語を含めることができます。各列の述語は値ベース、範囲ベースのいずれでも構いません。

断片1:

<logicalColumn1 predicate> AND <logicalColumn2 predicate > ... AND <logicalColumnM predicate>

断片n:

<logicalColumn1 predicate> AND <logicalColumn2 predicate > ... AND <logicalColumnM predicate>

すべての断片が同じM列に述語を持つのが理想的です。論理列に述語制約がない場合、Oracle Analytics問合せエンジンは断片にその論理列のすべての値のデータが含まれていると想定します。

並列コンテンツ記述の指定

並列のORを使用して、日付範囲内で複数年または複数月にわたるなど、複数の論理列にわたる日付を処理します。

並列のORテクニック使用して、論理列をまたがる複数の階層関係を処理します(年→年月→日、月→年月→日など)。たとえば、年と月など、異なる時点によって示される断片を考えます。履歴断片の選択のみを可能にするのであれば、年をさかのぼって制約を適用することで十分です。これは、並列のORテクニックによってサポートされます。

この例では、スナップショットの月は2022年4月1日午前12:00であると想定しています。

断片1 (履歴):

EnterpriseModel.Period."Day" < VALUEOF("Snapshot Date") OR
EnterpriseModel.Period.MonthCode < VALUEOF("Snapshot Year Month") OR
EnterpriseModel.Period."Year" < VALUEOF("Snapshot Year") OR
EnterpriseModel.Period."Year" = VALUEOF("Snapshot Year") AND
  EnterpriseModel.Period."Month in Year" < VALUEOF("Snapshot Month") OR
EnterpriseModel.Period."Year" = VALUEOF("Snapshot Year") AND
  EnterpriseModel.Period."Monthname" IN ('Mar', 'Feb', 'Jan')

断片2 (現在):

EnterpriseModel.Period."Day" >= VALUEOF("Snapshot Date") OR
EnterpriseModel.Period.MonthCode >= VALUEOF("Snapshot Year Month") OR
EnterpriseModel.Period."Year" > VALUEOF("Snapshot Year") OR
EnterpriseModel.Period."Year" = VALUEOF("Snapshot Year") AND
  EnterpriseModel.Period."Month in Year" >= VALUEOF("Snapshot Month") OR
EnterpriseModel.Period."Year" = VALUEOF("Snapshot Year") AND
  EnterpriseModel.Period."Monthname" IN ('Dec', 'Nov', 'Oct', 'Sep', 'Aug', 'Jul',
  'Jun', '', 'Apr')

論理モデルにおいて日付レベルの詳細が不要な場合は、前出の例のEnterpriseModel.Period."Day"の述語を省略します。

並列コンテンツ記述トラックをサポートするために、OR結合が使用されていることに注目してください。

不均衡な並列コンテンツ記述の指定

注文入力アプリケーションでは、履歴の断片と現在の断片の間の時間ベースの断片化では不十分です。

たとえば、レコードがスナップショットの日付の前にデータベースに入力された履歴レコードであったとしても、それらのレコードは揮発性である場合があります。

次の例では、未処理の注文は、その注文の発送が行われるかキャンセルされるまで、アプリケーションによって直接更新されることがあると想定します。ただし、注文の発送が行われた後にその注文に対して行われる変更は、個別の返品トランザクションの入力のみです。

次のコンテンツの記述には2つの並列トラックがあります。最初のトラックでは、前の項で説明した、複数列の並列トラックのテクニックが使用されています。ShippedまたはCanceledの注文状態の複数列コンテンツの記述の中で、カッコによって並列カレンダの記述がネストしていることに注目してください。

2番目の並列トラックは現在の断片の中にのみ存在し、すべての未処理レコードが現在の断片の中のみにあることを指定しています。

断片1 (履歴):

Marketing."Order Status"."Order Status" IN ('Shipped', 'Canceled') AND
  Marketing.Calendar."Calendar Date" <= VALUEOF("Snapshot Date") OR
Marketing.Calendar."Year" <= VALUEOF("Snapshot Year") OR
Marketing.Calendar."Year Month" <= VALUEOF("Snapshot Year Month")

断片2 (現在):

Marketing."Order Status"."Order Status" IN ('Shipped', 'Canceled') AND
  Marketing.Calendar."Calendar Date" > VALUEOF("Snapshot Date") OR
Marketing.Calendar."Year" >= VALUEOF("Snapshot Year") OR
Marketing.Calendar."Year Month" >= VALUEOF("Snapshot Year Month") OR
Marketing."Order Status"."Order Status" = 'Open'

並列トラックが存在する場合の重なり合いは許容されるため、2つの断片内で年と月が重なり合っても問題は生じません。このルールは、少なくとも1つのトラックに重なり合いが生じない必要があるというものです。他のトラックには重なり合いがあっても構いません。

並列コンテンツ記述の例

これらの例は、断片の内容の記述にラベルを使用する方法を示しています。

この例のTrack番号のラベルは、この例と後述の説明の関連をわかりやすくするために示されています。実際の断片化の内容の文には、これらのラベルは含めないでください。

断片1 (履歴)

Track 1  EnterpriseModel.Period."Day" < VALUEOF("Snapshot Date") OR
Track 2  EnterpriseModel.Period.MonthCode < VALUEOF("Snapshot Year Month") OR
Track 3  EnterpriseModel.Period."Year" < VALUEOF("Snapshot Year") OR
Track 4  EnterpriseModel.Period."Year" = VALUEOF("Snapshot Year") AND
  EnterpriseModel.Period."Month in Year" < VALUEOF("Snapshot Month") OR
Track 5  EnterpriseModel.Period."Year" = VALUEOF("Snapshot Year") AND
  EnterpriseModel.Period."Monthname" IN ('Mar', 'Feb', 'Jan')

たとえば、最初のトラックのEnterpriseModel.Period."Day"について考えます。この履歴の断片では、<述語は、Oracle Analytics問合せエンジンに対して、スナップショットの日付の前の日を制約するすべての問合せは履歴の断片内にあるということを通知します。反対に、日付の現在の断片内の>=述語は、現在の断片の中にスナップショットの日付の前のデータが含まれていないことを通知します。

2番目のトラックのMonthCode (たとえば、202112)は日付と似ています。月には重なる部分が存在しないため(スナップショットの日付は4月1日であるため)、このトラックでは<述語と>=述語を使用します。覚えておくべき重要なルールとして、追加されたそれぞれの並列トラックは異なる列セットを参照する必要があるという点があげられます。共通の列を使用することは可能ですが、列セット全体は一意である必要があります。Oracle Analytics問合せエンジンは、この列セットを使用して最も適切なトラックを選択します。

3番目のトラックのYear (履歴の断片内では<、現在の断片内では>)は、Oracle Analytics問合せエンジンに対して、年を制約する問合せに対する最適な(単一の)断片選択が可能であることを通知します。たとえば、「Year IN (2019, 2020)」の論理問合せは履歴の断片にのみヒットします。同様に、「Year = 2022」の問合せは現在の断片にのみヒットします。ただし、2021年にヒットする問合せは、このトラックに記述されているコンテンツでは回答できず、以降のトラックに追加の情報がないかぎり両方の断片にヒットします。

4番目のトラックは、Year (month integer)の形式で年と月の断片セットを記述しています。以前に説明した、複数列コンテンツ記述のテクニックに注目してください。また、これらの2つの列にはあいまいさや重なりがないため、<述語と>=述語を使用していることに注目してください。

5番目のトラックは、年と月の名前によって断片化の内容を記述しています。このトラックでは、値ベースのIN述語のテクニックを使用しています。

参考までに、スナップショットの日付がある月の特定の日付となる場合を考えます。したがってこの場合、複数列のコンテンツの年と月のみの記述は特定のスナップショットの月において重なります。このあいまいさを指定するには、<=述語と>=述語を使用します。

断片1 (履歴):

EnterpriseModel.Period."Day" < VALUEOF("Snapshot Date") OR
EnterpriseModel.Period.MonthCode <= VALUEOF("Snapshot Year Month") OR
EnterpriseModel.Period."Year" < VALUEOF("Snapshot Year") OR 
EnterpriseModel.Period."Year" = VALUEOF("Snapshot Year") AND
  EnterpriseModel.Period."Month in Year" <= VALUEOF("Snapshot Month") OR
EnterpriseModel.Period."Year" = VALUEOF("Snapshot Year") AND
  EnterpriseModel.Period."Monthname" IN ('Apr', 'Mar', 'Feb', 'Jan')

断片2 (現在):

EnterpriseModel.Period."Day" >= VALUEOF("Snapshot Date") OR
EnterpriseModel.Period.MonthCode >= VALUEOF("Snapshot Year Month") OR
EnterpriseModel.Period."Year" > VALUEOF("Snapshot Year") OR
EnterpriseModel.Period."Year" = VALUEOF("Snapshot Year") AND
  EnterpriseModel.Period."Month in Year" >= VALUEOF("Snapshot Month") OR
EnterpriseModel.Period."Year" = VALUEOF("Snapshot Year") AND
  EnterpriseModel.Period."Monthname" IN ('Dec', 'Nov', 'Oct', 'Sep', 'Aug', 'Jul',
  'Jun', '', 'Apr')