Analysis Services でのパーティションのマージ (SSAS - 多次元)
既存の Analysis Services データベース内のパーティションをマージして、同じメジャー グループの複数のパーティションからファクト データを統合することができます。
一般的なシナリオ
必要条件
パーティションのマージ後にパーティション ソースを更新
ファクト テーブルまたは名前付きクエリによって分割されたパーティションに関する注意事項
SSMS を使用してパーティションをマージする方法
XMLA を使用してパーティションをマージする方法
一般的なシナリオ
最も一般的なパーティション構成では、時間ディメンション全体にわたってデータが分割されます。 各パーティションに関連付けられている時間の粒度は、そのプロジェクト固有のビジネス要件によって異なります。 たとえば、データを年で分割し、そのうち最も新しい年を月で分割して、さらにアクティブな月に対して別のパーティションを作成する場合があります。 このアクティブな月のパーティションは、定期的に新しいデータを取得します。
アクティブな月が終了すると、そのパーティションは現在までのパーティション内の月にマージされ、処理が続行されます。 年末には、新しい年のパーティションが作成されます。
このシナリオが示すように、パーティションのマージは、定期的に実行される日常的なタスクとなり、履歴データを統合および整理するための革新的な方法を提供します。
必要条件
パーティションをマージできるのは、次の条件をすべて満たしている場合に限ります。
同じメジャー グループであること
同じ構造であること
処理済みの状態であること
同じストレージ モードであること
同じ集計デザインを含むこと
同じ文字列ストアの互換性レベルを共有していること (パーティション分割された個別のカウント メジャー グループにのみ適用されます)
マージ先のパーティションが空の場合 (つまり、集計デザインがあっても集計が含まれていない場合)、マージによってマージ元のパーティションの集計が削除されます。 集計を作成するには、パーティションで "インデックスの処理"、"完全処理"、または "既定の処理" を実行する必要があります。
リモート パーティションは、Analysis Services の同一のリモート インスタンスで定義された他のリモート パーティションとだけマージできます。
注 |
---|
ローカル パーティションとリモート パーティションを組み合わせて使用している場合は、別の方法として、結合したデータを含む新しいパーティションを作成し、今後使用しないパーティションを削除する方法もあります。 |
将来のマージに備えたパーティションを作成するには、パーティション ウィザードでパーティションを作成するときに、キューブ内の別のパーティションから集計デザインを選択してコピーします。 これによって、これらのパーティションは同じ集計デザインを持つようになります。 これらのパーティションがマージされると、ソース パーティションの集計はターゲット パーティションの集計に結合されます。
パーティションのマージ後にパーティション ソースを更新
パーティションは、データの処理に使用する SQL クエリの WHERE 句などのクエリ、またはパーティションにデータを提供するテーブルや名前付きクエリによって分割されます。 パーティションの Source プロパティは、パーティションがクエリまたはテーブルにバインドされているかどうかを示します。
パーティションをマージすると、パーティションの内容は統合されますが、Source プロパティはパーティションの追加のスコープを反映するように更新されません。 つまり、その後、元の Source を保持するパーティションを再処理すると、そのパーティションから不適切なデータを取得することになります。 パーティションは、誤って親レベルのデータを集計します。 次の例では、この動作を示します。
問題
3 種類の清涼飲料水商品についての情報を含むキューブがあるとします。 このキューブには、同一のファクト テーブルを使用する 3 つのパーティションがあります。 これらのパーティションは商品ごとに分割されます。 パーティション 1 には ColaFull、パーティション 2 には ColaDecaf、パーティション 3 には ColaDiet のデータがそれぞれ含まれます。 ここで、パーティション 3 がパーティション 2 にマージされる場合、マージ後のパーティション (パーティション 2) 内のデータとキューブ データは共に正確です。 ただし、パーティション 2 が処理されると、その内容は商品レベルのメンバーの親によって決定されます。 この親 [SoftDrinks] には、パーティション 1 の製品の [ColaFull] も含まれます。 パーティション 2 を処理すると、このパーティションに [ColaFull] を含むすべての清涼飲料水のデータが読み込まれます。 この結果、キューブには ColaFull のデータが重複して含まれ、エンド ユーザーに不正なデータが返されます。
解決策
この問題を解決するには、WHERE 句または名前付きクエリを調整するか、基になるファクト テーブルから手動でデータをマージするかによって Source プロパティを更新し、パーティションのスコープを拡張した状況でその後の処理が正確になるようにします。
この例では、パーティション 3 をパーティション 2 にマージした後で、マージ後のパーティション 2 で ("Product" = 'ColaDecaf' OR "Product" = 'ColaDiet') のようなフィルターを作成できます。これにより、ColaDecaf と ColaDiet のデータのみをファクト テーブルから取得し、ColaFull のデータは除外するように指定できます。 または、パーティション 2 とパーティション 3 の作成時にフィルターを指定することもできます。これらのフィルターはマージ処理で結合されます。 いずれの場合も、パーティションを処理した後にキューブに重複データが含まれることはなくなります。
結論
パーティションをマージした後は、必ず Source をチェックして、マージされたデータに対してフィルターが正しいことを確認してください。 Q1、Q2、および Q3 の履歴データが含まれたパーティションから始めて、これから Q4 をマージする場合、Q4 が含まれるようにフィルターを調整する必要があります。 そうしないと、その後のパーティションの処理で誤った結果が生成されます。 Q4 にとって正しくなくなります。
ファクト テーブルまたは名前付きクエリによって分割されたパーティションに関する注意事項
パーティションは、クエリのほか、テーブルまたは名前付きクエリでも分割できます。 マージ元のパーティションとマージ先のパーティションがデータ ソースまたはデータ ソース ビューで同じファクト テーブルを使用している場合、Source プロパティは、パーティションのマージ後に有効になります。 このプロパティでは、結果パーティションに適したファクト テーブル データが指定されます。 結果パーティションに必要なファクトはファクト テーブル内に存在するので、Source プロパティを変更する必要はありません。
複数のファクト テーブルまたは名前付きクエリのデータを使用するパーティションでは、追加の作業が必要です。 マージ元パーティションのファクト テーブルのファクトは、マージ先パーティションのファクト テーブルに手動でマージする必要があります。
または、マージされたパーティションのソースを、2 つの別個のファクト テーブルの内容を返す名前付きクエリに変更することもできます。 この操作を行わないと、ファクト テーブルに含まれる情報が完全になりません。
同様の理由で、名前付きクエリから分割されたデータを取得するパーティションを更新する必要もあります。 結合されたパーティションには、以前に別の名前付きクエリから取得した、結合された結果セットを返す名前付きクエリが必要になります。
パーティション ストレージの注意事項: MOLAP
MOLAP パーティションをマージすると、パーティションの多次元構造に格納されているファクトもマージされます。 これにより、内部的に完全で矛盾のないパーティションが作成されます。 ただし、MOLAP パーティションに格納されるファクトは、ファクト テーブル内のファクトのコピーです。 パーティションに対して処理が行われると、多次元構造内のファクトは削除され (完全と更新のみ)、パーティションのデータ ソースとフィルターの指定に従って、ファクト テーブルからデータがコピーされます。 マージ元パーティションで使用されるファクト テーブルがマージ先パーティションのものと異なる場合、マージ元パーティションのファクト テーブルをマージ先パーティションのファクト テーブルに手動でマージして、結果パーティションが処理されるときにデータの完全なセットを利用できるようにしてください。 これは、2 つのパーティションが、それぞれ異なる名前付きクエリに基づいている場合にも適用されます。
重要 |
---|
マージされた MOLAP パーティションに不完全なファクト テーブルが含まれている場合、パーティションには内部的にマージされたファクト テーブル データのコピーが含まれているので、そのパーティションが処理されるまでは正常に動作します。 |
パーティション ストレージの注意事項: HOLAP パーティションと ROLAP パーティション
複数のファクト テーブルを持つ HOLAP パーティションや ROLAP パーティションをマージする場合、ファクト テーブルは自動的にマージされません。 ファクト テーブルを手動でマージしない場合、結果パーティションではマージ先パーティションに関連付けられたファクト テーブルのみを利用できます。 マージ元パーティションに関連付けられたファクトは、結果パーティションのドリル ダウンでは利用できません。また、パーティションが処理されると、集計処理では、利用できないテーブルのデータを集約しなくなります。
重要 |
---|
マージされた HOLAP パーティションや ROLAP パーティションが不完全なファクト テーブルを持っていると、そこに含まれる集計は正確ですが、ファクトは不完全になります。 欠落したファクトを参照するクエリは、不正確なデータを返します。 パーティションが処理されると、集計は利用可能なファクトからのみ計算されます。 |
利用できないテーブル内のファクトにドリル ダウンしたり、利用できないテーブルのファクトを必要とするクエリを実行しない限り、利用できないファクトの欠落に気が付かない場合があります。 集計はマージ処理の間に結合されるので、結果が集計のみに基づくクエリでは正確なデータが返されますが、それ以外のクエリでは不正確なデータが返される可能性があります。 結果パーティションが処理された後でも、特に利用できないファクト テーブルによるデータ欠落が、結合されたデータに占める割合が小さい場合は、気が付かないことがあります。
ファクト テーブルは、パーティションのマージの前または後にマージできます。 ただし、両方のマージ処理が完了しないと、集計ではその基になるファクトが正確に表されません。 複数のファクト テーブルにアクセスする HOLAP パーティションや ROLAP パーティションの場合は、これらのパーティションを含むキューブに接続しているユーザーがいない間にマージを行うことをお勧めします。
SSMS を使用してパーティションをマージする方法
重要 |
---|
パーティションをマージする前に、まず、データのフィルター情報 (多くの場合は、SQL クエリに基づくフィルターの WHERE 句) をコピーしてください。 その後、マージが完了したら、蓄積されたファクト データを含むパーティションのパーティション ソース プロパティを更新する必要があります。 |
オブジェクト エクスプローラーで、マージするパーティションが含まれているキューブの [メジャー グループ] ノードを展開し、[パーティション] を展開して、マージ操作の対象となるパーティションを右クリックします。 たとえば、年間のファクト データを格納するパーティションに四半期のファクト データを移動する場合は、年間のファクト データが含まれているパーティションを選択します。
[パーティションのマージ] をクリックして [パーティションのマージ - <パーティション名>] ダイアログ ボックスを開きます。
[基になるパーティション] で、対象パーティションとマージする、基になる各パーティションの横のチェック ボックスをオンにし、[OK] をクリックします。
注 基になるパーティションは、対象パーティションにマージされた直後に削除されます。 マージが完了したら、[パーティション] フォルダーを更新してその内容を更新します。
蓄積したデータが含まれるパーティションを右クリックし、[プロパティ] をクリックします。
Source プロパティを開き、マージしたパーティション データを含むように WHERE 句を変更します。 Source プロパティは自動的に更新されないことに注意してください。 最初に Source を更新せずに再処理すると、必要なデータの一部が取得されない場合があります。
XMLA を使用してパーティションをマージする方法
詳細については、「パーティションのマージ (XMLA)」を参照してください。
関連項目
タスク
概念
パーティション (Analysis Services - 多次元データ)
ローカル パーティションの作成と管理 (Analysis Services)