キューブ・バージョンの使用
この付録では、キューブ・バージョン機能の使用法を説明します。この機能を使用すると、実行中クエリのわずかな中断しか伴わずに、キューブ定義の変更、構築、ユーザへの提供を行うことができます。この付録では、以下の項目について説明します。
この機能を使用するには、キューブあたり 2 倍のディスク領域が必要です。また、スタジオでキューブ・クラスを編集することも必要になります。
形式的に共有されるディメンジョンを定義するキューブの場合、キューブ・バージョン機能はサポートされません。また、単方向リレーションシップを定義するキューブの場合もサポートされません。この機能は、双方向リレーションシップを定義するキューブでは使用できます。
キューブ・バージョン機能の概要
キューブ・バージョン機能を使用すると、実行中クエリのわずかな中断しか伴わずに、キューブ定義の変更、構築、ユーザへの提供を行うことができます。この機能は、以下のように実行されます。
-
指定したキューブ定義にバージョンを付与できます。
-
DeepSee は、キューブ・バージョンごとにバージョン固有のファクト・テーブルとディメンジョン・テーブルを生成します。
-
どの時点でも、1 つのキューブ・バージョンのみがアクティブになります。ユーザ・インタフェースとすべての生成されたクエリではこのバージョンが使用されます。
-
最新のキューブ・バージョンを使用可能にするには、そのバージョンをアクティブ化する必要があります。アクティブ化した時点で、DeepSee は一時的にどのクエリも実行できないようにしてから、最新のバージョンに切り替えます。
以下の図は、このプロセス全体を示しています。
キューブの論理名はアクティブ・キューブに自動的にリダイレクトされます。アナライザと他のユーザ・インタフェースではキューブの論理名のみが使用されるため、アクティブ・キューブのみが認識されます。同様に、%DeepSee.UtilsOpens in a new tab 内のメソッドを使用している場合に、バージョン番号なしでキューブの論理名を指定した場合は、DeepSee はそのメソッドをアクティブ・キューブに対して実行します。
キューブ・バージョン番号を更新して (スタジオで)、リコンパイルすると、保留キューブが作成され、その後ユーザはこのキューブを構築できます。準備ができたら、ユーティリティ・メソッドを使用してこのキューブをアクティブ化します。これにより、保留キューブがアクティブになり、直前までアクティブであったキューブが使用されなくなります。
既定では、このアクティブ化プロセスによってその使用されなくなったキューブが自動的に削除されます。キューブ・バージョン機能の目的は、バージョン間の切り替えを支援することではありません。
最適な方法は、ソース・コントロールを使用することです。キューブ・バージョン機能はソース・コントロールの代替となるものではありませんが、ソース・コントロールと組み合わせると役に立つことがあります。
キューブの最新状態の維持
あるキューブでキューブ・バージョン機能が使用されている場合、そのキューブのアクティブ・バージョンを構築することはできません。すなわち、$SYSTEM.DeepSee.BuildCube() メソッドはアクティブ・バージョンには適用されず、代わりにエラーが返されます。アーキテクトの [ビルド] オプションも同じ動作を示します。これらの操作はブロックされます。その理由は、これらの操作によって実行中のクエリが長時間にわたって中断されますが、この機能の目的はそのような中断を防止することだからです。
そのキューブを同期できます。
クエリ中断の原因となり得るモデルの変更
キューブ・バージョン機能は、アクティブ・キューブ上で正常に機能しているクエリが保留キューブ上でも正常に機能するかどうかをチェックしません。例えば、アクティブ・キューブで定義されたモデル要素が保留キューブに含まれなくなった場合、保留キューブをアクティブ化すると、その要素を使用するクエリはすべて機能しなくなります。このため、ユーザ側で、中断の原因となる可能性のあるモデル変更を特定して、そのような変更を適切に扱う必要があります。
バージョンをサポートするためのキューブの変更
キューブでキューブ・バージョン機能がサポートされるようにキューブを変更するには (および初期バージョンを作成してアクティブ化するには)、以下の手順を実行します。
キューブ・バージョンに移行しようとしており、かつこの機能を使用しない既存のキューブがあり、かつどのクエリも中断させたくない場合は、この注意事項をお読みください。
キューブ・バージョンに移行する場合、そのためのプロセスは最初のキューブ・バージョンでは異なります。具体的には、最初のキューブ・バージョンは現在使用されているキューブ (バージョン管理されていないキューブ定義) とランタイム上の互換性を備えている必要があります。すなわち、最初のキューブ・バージョンによって、バージョン管理されていないキューブ定義と比較して、どのメジャーやレベルも削除および再定義されてはいけません。要素を追加することはできます。そのことは既存のクエリに影響を与えないからです。
-
キューブ・クラスに以下のパラメータを追加します。
Parameter USECUBEVERSIONS=1;
この変更と次の変更を加えるには、スタジオを使用する必要があります。
-
以下の属性を <cube> 要素に追加して、クラスを保存します。
version="versionnum"
ここで、versionnum は整数です。
-
クラスをコンパイルします。この時点で、DeepSee によってこのキューブ用に生成されたパッケージに、新しいサブパッケージ (Versionversionnum という名前) が含まれています。以下はその例です。
この例では、新しいパッケージは HoleFoods.Cube.Version1 です。
HoleFoods.Cube.FactOpens in a new tab、HoleFoods.Cube.ListingOpens in a new tab、HoleFoods.Cube.Star475620761Opens in a new tab などのクラスは以前は存在していましたが、これらは USECUBEVERSIONS の追加前にこのキューブ用に生成されました。キューブ・バージョン・ユーティリティではこれらのキューブ定義は扱われません。
-
必要に応じてキューブ定義に変更を加えます。このセクションの冒頭にある重要な注意事項を読んで、どのような変更を加えるのかを決定します。変更内容を保存します。
-
キューブを構築します。この手順は、実行中のクエリには影響を与えません (このセクション冒頭の重要な注意事項に記載されたガイドラインに従っている場合は、これより前の手順も実行中のクエリには影響を与えません)。
ターミナルでキューブを構築する場合は、少し異なる出力が表示されて、特定のキューブ・バージョンを構築していることが示されます。次に例を示します。
Building cube [HOLEFOODS:1]
-
ターミナルで、%DeepSee.CubeVersion.UtilsOpens in a new tab クラスの %ActivatePendingCubeVersion() メソッドを実行します。このメソッドは、構築するキューブの名前である 1 つの引数を取ります (バージョン番号なしで)。次に例を示します。
d ##class(%DeepSee.CubeVersion.Utils).%ActivatePendingCubeVersion("holefoods")
このメソッドは、以下のような出力を表示します。
Pending version for holefoods: 1 Pending version synchronized: HOLEFOODS:1 Queries locked for cube: holefoods Killing active tasks for cube: holefoods Cube version activated: HOLEFOODS:1 Removing non-versioned cube data
このメソッドの 1 つのステップが原因で、このキューブに対してクエリを一時的に実行できなくなりますが、ほとんどの場合はユーザ側では実際の遅延は感じられません。
この時点で、すべてのユーザに新しいバージョンのキューブが表示されます。
-
キューブ・マネージャを使用してこのキューブを更新する場合は、キューブの更新計画が [同期のみ] または [手動] であることを確認します。“キューブの最新状態の維持” を参照してください。
キューブのバージョンとリレーションシップ
リレーションシップに含まれるキューブでキューブ・バージョン機能を使用できます。ルールは以下のとおりです。
-
すべてのリレーションシップは、一方向ではなく双方向である必要があります。
-
それぞれの関連キューブでもキューブ・バージョンを指定する必要があります。
-
バージョンを更新して、新しいバージョンを構築して、いずれかのキューブの新しいバージョンをアクティブ化する際は、すべての関連キューブに対して同じ操作を実行する必要があります。
-
関連キューブをアクティブ化する順序は、それらのキューブを構築する順序と同じである必要があります。"DeepSee 上級モデリング・ガイド" の “関連キューブの構築順序の決定” を参照してください。
%ActivatePendingCubeVersion() の詳細
%ActivatePendingCubeVersion() メソッドには、以下のシグニチャがあります。
ClassMethod %ActivatePendingCubeVersion(pCubeGenericName As %String,
pRemoveDeprecated As %Boolean = 1,
pVerbose As %Boolean = 1) As %Status
以下は、この指定の説明です。
-
pCubeGenericName は、キューブの名前です (バージョン番号は含まない)。この引数では大文字と小文字は区別されません。
-
pRemoveDeprecated は、このメソッドによって、現在は使用されていないキューブ・バージョンも削除するかどうかを指定します。この引数の値が 1 の場合は、このメソッドによって、現在は使用されていないキューブ・バージョンのファクト・テーブルとそのデータ、ディメンジョン・テーブルとそのデータ、すべてのキャッシュされたデータ、およびすべての内部使用メタデータが削除されます。
このメソッドを初めて使用する際は、バージョン管理されていないキューブからの移行時に、そのバージョン管理されていないキューブでファクト・テーブルなどに格納されているデータが削除されます。バージョン管理されていない生成済みクラスは、DeepSee で必要なため削除されません。
-
pVerbose は、このメソッドの処理ステージを示すメッセージを表示するかどうかを指定します。
キューブ・バージョンの更新
最初のキューブ・バージョンをまだアクティブ化していない場合は、前のセクションを参照してください。最初のキューブ・バージョンをコンパイルする際は、そのキューブに何らかの変更を加えると、そのキューブをアクティブ化する前であっても、実行中のクエリが影響を受けます。したがって、バージョン管理されていないキューブとランタイム上の互換性があるいずれかのバージョンのキューブをコンパイル、構築、およびアクティブ化する必要があります。このことの意味については、前のセクションを参照してください。
キューブを既に変更して初期バージョンを作成した場合は、以下の手順に従ってそのキューブを更新してください。
-
まず、<cube> 要素内で、新しいバージョン番号を使用するようにキューブ・クラスを変更します。これにより、キューブに対する変更が本来より早い段階で表示されることが防止されます。(表示名などの一部のキューブ変更内容は、キューブをコンパイルした時点で有効になります。"DeepSee モデルの定義" の “リコンパイルおよび再構築のタイミング” を参照してください。)
-
キューブ・クラスを保存します。
-
希望に応じてキューブに変更を加えて、それらの変更内容を保存します。
実働システムの場合は、まず別のシステム上でこれらの変更内容をテストしてください。
-
キューブをコンパイルします。
この時点で、DeepSee によってこのキューブ用に生成されたパッケージに、新しいバージョン番号を持つ別の新しいサブパッケージが含まれています。次に例を示します。
-
キューブを構築します。
-
ターミナルで、%DeepSee.CubeVersion.UtilsOpens in a new tab クラスの %ActivatePendingCubeVersion() メソッドを実行します。この場合は、このメソッドは以下のような出力を表示します。
Pending version for holefoods: 2 Pending version synchronized: HOLEFOODS:2 Queries locked for cube: holefoods Killing active tasks for cube: holefoods Cube version activated: HOLEFOODS:2 Deprecating previously active version: HOLEFOODS:1 Removing previously active version: HOLEFOODS:1
この時点で、DeepSee によってこのキューブ用に生成されたパッケージに、新しいバージョン番号を持つサブパッケージのみが含まれています。次に例を示します。
この時点で、すべてのユーザに新しいキューブが表示されます。
バージョニング機能を使用するキューブに基づいて、サブジェクト領域を定義できます。ベース・キューブでの変更と同様に、キューブ・バージョンを変更する際には、正しく機能するようにサブジェクト領域をリコンパイルする必要があります。
操作対象のキューブの指定
キューブ・バージョンを使用する場合は、以下の方法で操作対象のキューブを指定できます。
-
アナライザまたはクエリ・ツールで手動クエリを作成する際は、以下のいずれかの形式のキューブ名を使用できます。
-
論理キューブ名。この場合は、そのクエリではアクティブ・バージョンのキューブが使用されます。
-
cubename:versionnum という形式。ここで、cubename は論理キューブ名であり、versionnum はバージョン番号です。この場合は、そのクエリでは指定されたバージョンが使用されます。
-
-
アナライザやキューブ・マネージャなどのユーザ・インタフェースでは、アクティブ・バージョンのみを操作できます (ただし例外として上の項目で述べたケースは除きます)。
これらのユーザ・インタフェースでは、バージョン情報が含まれていないキューブ・キャプションのみが表示されます。
また、変更内容を保存すると、手動クエリにバージョン番号を入力した場合を除いて、保存されたデータには論理キューブ名のみが含まれます (バージョン番号は含まれない)。既定では、ピボット・テーブルとリスト・グループの定義にはバージョン番号は含まれません。
-
キューブ名を引数として指定できる %DeepSee.UtilsOpens in a new tab 内のメソッドを使用する場合は、論理キューブ名または cubename:versionnum という形式のキューブ名を使用できます。
-
MDX シェルでは、論理キューブ名または cubename:versionnum という形式のキューブ名を使用できます。シェル内でトレースが有効になっている場合は、シェルにはキューブ・バージョン番号が表示されます。
追加のオプション
%DeepSee.CubeVersion.UtilsOpens in a new tab クラスでは、デバッグ目的に使用できる追加のメソッドが提供されています。以下はその概要です。
-
%GetVersionedCubeName()
-
%DeprecateCubeVersion()
-
%SetPendingCubeVersion()
-
%RemoveCubeVersion()
詳細は、%DeepSee.CubeVersion.UtilsOpens in a new tab のクラスリファレンスを参照してください。
また、%DeepSee.UtilsOpens in a new tab の %BuildCube() は、参照によって、アクティブ・バージョン番号が含まれたキューブ名を返すことができます。以下はその例です。
SAMPLES>set cubename="patients"
SAMPLES>set status=##class(%DeepSee.Utils).%BuildCube(.cubename)
Building cube [PATIENTS:1]
Existing cube deleted.
Fact table built: 1,000 fact(s) (2 core(s) used)
Fact indices built: 1,000 fact(s) (2 core(s) used)
Complete
Elapsed time: 0.461454s
Source expression time: 0.298187s
SAMPLES>w cubename
PATIENTS:1
$SYSTEM.DeepSee.BuildCube() メソッドにはこのオプションはありません。
キューブ・バージョン機能の無効化
指定したキューブのバージョンを無効にする手順は以下のとおりです。
-
キューブ・クラスを編集して、USECUBEVERSIONS の値として 0 を指定します。
-
クラスを保存して、コンパイルします。
-
キューブを構築します。
-
希望に応じて、不要になったキューブ・バージョンを削除します。ターミナルで以下のコマンドを実行します。
set status=##class(%DeepSee.CubeVersion.Utils).%RemoveCubeVersion(cubename,version)
ここで、cubename は論理キューブ名であり、versionnum はバージョン番号です。
アクティブ・バージョンを削除しようとした場合は、このメソッドはエラーを返します。
この時点から、このキューブはバージョン管理されていないキューブと同じ動作を示します。