キューブの最新状態の維持
この章では、キューブ・マネージャなどのツールを使用してキューブを更新する方法について説明します。以下のトピックについて説明します。
付録の “キューブ・バージョンの使用” も参照してください。
概要
一般的なフレーズ「キューブの更新」は、ソース・テーブルおよび関連テーブルの現在の内容をキューブに反映させるプロセスを表します。DeepSee には 3 つの方法があります。
-
キューブを再構築します (例えば、アーキテクトで [再構築] オプションを使用)。このプロセスは時間がかかる場合があり、キューブの再構築中にはクエリを実行できません。
-
キューブを同期します。キューブの同期機能 (DSTIME 機能とも呼ばれる) を使用すると、DeepSee でデータへの変更を追跡できます。定期的にキューブを同期し、変更を組み込みます。
同期中にクエリを実行することは可能です。
キューブの実装および変更するデータによっては、この機能を使用できない場合があります。この章で後述する “キューブの同期が可能なとき” を参照してください。
-
キューブを手動で更新します。このプロセスは、%ProcessFact() メソッドおよび %DeleteFact() メソッドを使用します。他のオプションと異なり、この場合、ファクト・テーブルのどのレコードを更新または削除するかをコードが認識する必要があります。
手動更新中にクエリを実行することは可能です。
これらの方法を適切に組み合わせて使用できます。以下のテーブルでは、上記の方法を比較しています。
再構築 | 同期 | 手動による更新 | |
---|---|---|---|
プロセスにかかる時間の比較 | 長い | 短い | 短い |
プロセス中にクエリを実行できるか | いいえ | はい | はい |
すべてのシナリオで使用可能か | はい | いいえ | はい |
変更するレコードを認識している必要があるか | いいえ | いいえ | はい |
結果キャッシュの一部が無効になるか | はい | はい | はい |
このオプションを提供するユーザ・インタフェース | キューブ・マネージャおよびアーキテクト | キューブ・マネージャ | なし |
キューブ・マネージャの詳細は、この章で後述する “キューブ・マネージャを使用する方法” を参照してください。
キューブの更新および関連キューブ
どのような更新でも、キューブ間のリレーションシップがある場合には必ず、特定の順序でキューブを更新する必要があります。特に、まず独立したキューブを更新します。次に、これに依存するキューブを更新します。これを行うために、キューブ・マネージャを使用できます。これは、リレーションシップを検索し、正しい更新順序を判断します。
または、DeepSee のキューブを適切な順序で構築するユーティリティ・メソッドまたはルーチンを作成して使用できます。
キューブの更新および結果キャッシュ
(既定で) 512,000 レコードより多く使用するキューブの場合、DeepSee は、結果キャッシュを保持し、使用します。更新方法とツールのどのような組み合わせでも、キューブの更新の頻度も注意深く考慮する必要があります。これは、どの更新でも結果キャッシュの一部を無効化する可能性があるためです。
大量のデータ・セットの場合、DeepSee は、以下のように各キューブの結果キャッシュを保持し、使用します。ユーザが (例えばアナライザを使用して) クエリを実行するたびに、DeepSee はそのクエリの結果をキャッシュします。次回そのクエリを任意のユーザが実行すると、DeepSee はそのキャッシュがまだ有効かどうかをチェックします。有効な場合、DeepSee はキャッシュの値を使用します。それ以外の場合、DeepSee はクエリを再実行し、新しい値を使用して、それらをキャッシュします。その実質的な効果は、より多くのユーザがより多くのクエリを実行するほど、経時的にパフォーマンスが向上することです。
なんらかの方法でキューブを更新する場合、結果キャッシュの一部が無効とみなされてクリアされます。詳細はキューブ定義のオプションに応じて異なります (このドキュメントで前述した “キャッシュのバケットとファクトの順序” を参照)。したがって、通常、頻繁に更新することは望ましくありません。
キューブの同期が機能する方法
ここでは、キューブの同期が機能する方法について簡単に説明します。内部的に、この機能には 2 つのグローバル、^OBJ.DSTIME と ^DeepSee.Update を使用しています。
最初に、キューブの初期ビルドを実行する必要があります。
Caché が、キューブによって使用されるソース・テーブル内で変更を検出すると、エントリを ^OBJ.DSTIME グローバルに追加します。これらのエントリには、追加、変更、または削除が行われた ID を示す目的があります。
キューブを同期する場合 (この章で後述する %SynchronizeCube() を使用)、最初に Caché は ^OBJ.DSTIME グローバルを読み取り、それを使用して ^DeepSee.Update グローバルを更新します。ID が ^DeepSee.Update グローバルに追加された後、Caché は ^OBJ.DSTIME グローバルから同じ ID を削除します。(以前のバージョンでは、キューブの同期機能は 1 つのグローバルのみ使用していました。新しいシステムでは競合条件を回避します。)
次に、Caché は ^DeepSee.Update グローバルを使用して、キューブのファクト・テーブルとディメンジョン・テーブルを更新します。これにより、キューブが最新状態になります。
以下の図は、このプロセス・フローを示しています。
サブセクションでは、以下の詳細について説明します。
キューブの同期が可能なとき
キューブ同期機能は、以下のすべての項目に当てはまるシナリオで使用できます。
-
キューブのベース・クラスが永続クラスである (ただし、リンク・テーブルではないこと)。
-
変更されたレコードがそのクラス内のレコードである。
キューブの同期が不可能なとき
キューブ同期機能は、以下のシナリオでは使用できません。
-
キューブのベース・クラスがデータ・コネクタである。(“データ・コネクタの定義” の章を参照してください。)
-
キューブのベース・クラスがリンク・テーブルである。("Caché SQL の使用法" の “Caché SQL ゲートウェイの使用法” を参照してください。)
-
変更されたレコードがキューブで使用されるベース・クラスのエクステント内にない。つまり、変更されたレコードが別のテーブルに属している。
これらのシナリオでは、キューブ同期機能によって変更を検出できず、“キューブの手動更新” の説明に従って、手動でキューブを更新する必要があります。
また、キューブ同期は年齢ディメンジョン (つまり、[ディメンジョン・タイプ] が [年齢] であるディメンジョン) に影響しません。
ミラーリング環境におけるキューブの同期
DeepSee をミラー・サーバで使用する場合、^OBJ.DSTIME グローバルはアプリケーション・データの一部であり、ミラーリングする必要があることに注意してください (例えば、異なるデータベースにマップされている場合は、そのデータベースをミラーリングする必要があります)。^DeepSee.Update グローバルは DeepSee コードにより生成されます。そのため、キューブ定義とデータが含まれるデータベースにのみ存在します。
ミラー・サーバでは、^OBJ.DSTIME グローバルと ^DeepSee.Update グローバルを格納しているデータベースを読み取り/書き込みに設定しておく必要があります。これらのグローバルは、同じデータベースに両方とも格納することもできますが、上記の図では個別のデータベースに格納しています。
ミラー・サーバでの DeepSee の使用に関する詳細は、このマニュアルの最初の章の “推奨アーキテクチャ” を参照してください。
キューブの同期のグローバルの構造
ここでは、キューブの同期のグローバルの構造について説明します。この情報は、キューブの同期を使用するのに必要ではありません。しかし、これらのグローバルを他の目的で使用する場合を考慮して提供されています。
^OBJ.DSTIME
DSINTERVAL が設定されているかどうかによって、^OBJ.DSTIME グローバルには別の形式があります。
DSINTERVAL が設定されていない場合、このグローバルには以下のようなノードがあります。
ノード | 値 |
---|---|
^OBJ.DSTIME(class、increment、ID)。ここで、class はソース・クラスの完全なパッケージおよびクラス名です。increment は 0 です。ID は、所定のクラスの新規レコード、変更されたレコード、または削除されたレコードの ID です。 | 以下の値のいずれかです。
|
DSINTERVAL が設定されている場合、このグローバルには以下のようなノードがあります。
ノード | 値 |
---|---|
^OBJ.DSTIME(class、timestamp、ID)。ここで、class と ID は他のシナリオの場合と同じです。timestamp は、1840 年 12 月 31 日午前零時以降の秒数です | 他のシナリオの場合と同じ |
キューブの同期または再ビルドが行われるときに、DeepSee は不要なエントリを ^OBJ.DSTIME グローバルから削除します。
^DeepSee.Update
^DeepSee.Update グローバルには以下のようなノードがあります。
ノード | 値 |
---|---|
^DeepSee.Update | 使用する次の increment の値を示す整数 |
^DeepSee.Update(class、increment、ID)。ここで、class はソース・クラスの完全なパッケージおよびクラス名です。increment は 0 または正の整数です。ID は、所定のクラスの新規レコード、変更されたレコード、または削除されたレコードの ID です。キューブが同期されるたびに、DeepSee は次に大きい increment 整数値を使用して、このグローバルにノードを更新します。例を参照してください。 | ^OBJ.DSTIME グローバルの場合と同じ |
^DeepSee.Update("cubes"、cube、"dstime")。ここで、cube はキューブの論理名です | 特定のキューブに対する変更を記録するために、このグローバルでノードを作成するときに使用する increment の次の値を示す整数。 |
^DeepSee.Update("cubes"、cube、"lastDataUpdate")。ここで、cube はキューブの論理名です | このキューブが最後に同期化されたときの日付と時間 ($H 形式)。 |
次に例を示します。
^DeepSee.Update=3
^DeepSee.Update("DeepSee.Study.Patient",0,1)=0
^DeepSee.Update("DeepSee.Study.Patient",0,2)=0
^DeepSee.Update("DeepSee.Study.Patient",0,100)=0
^DeepSee.Update("DeepSee.Study.Patient",1,1)=2
^DeepSee.Update("DeepSee.Study.Patient",1,120)=0
^DeepSee.Update("DeepSee.Study.Patient",2,42)=0
^DeepSee.Update("DeepSee.Study.Patient",2,43)=0
^DeepSee.Update("DeepSee.Study.Patient",2,50)=0
^DeepSee.Update("DeepSee.Study.Patient",2,57)=0
^DeepSee.Update("cubes","PATIENTS","dstime")=3
^DeepSee.Update("cubes","PATIENTS","lastDataUpdate")="64211,63222.68"
^DeepSee.Update("DeepSee.Study.Patient",0) の下のノードは、最初の変更セットを表し、^DeepSee.Update("DeepSee.Study.Patient",1 の下のノードは、2 番目の変更セットを表します。その後も同様に続きます。
DeepSee が ^DeepSee.Update グローバルからノードを自動的に削除することはありません。このグローバルの削除の詳細は、“DSTIME の削除” を参照してください。
キューブ同期の有効化
キューブを同期する前に、そのキューブのキューブ同期機能を有効化する必要があります。そのためには、以下の操作を実行します。
-
キューブ同期がシナリオで可能になっていることを確認します。この章で前述の “キューブの同期が可能なとき” を参照してください。
-
以下のように、DSTIME パラメータをそのキューブで使用されるベース・クラスに追加します。
Parameter DSTIME="AUTO";
パラメータ値では、大文字と小文字が区別されません。
-
また、必要に応じてベース・クラスに以下のパラメータも追加します。
Parameter DSINTERVAL = 5;
このパラメータは主に、エントリが ^OBJ.DSTIME グローバルに保存される方法に影響を与えます。“キューブの同期のグローバルの構造” を参照してください。^OBJ.DSTIME グローバルの形式は、キューブの同期メカニズムの動作に影響を与えません。
-
ベース・クラスと、そのベース・クラスが使用するすべてのキューブ・クラスをリコンパイルします。
-
それらのキューブをリビルドします。
キューブ・マネージャを使用する方法
このセクションでは、キューブの更新の管理に役立つように設計されている、キューブ・マネージャにアクセスして使用する方法について説明します。キューブの更新方法と更新時期をキューブ・マネージャで指定します。キューブ・マネージャでは、選択したスケジュール日時にキューブの再構築や同期を実行するタスクを追加できます。このセクションでは、以下の項目について説明します。
キューブ・マネージャのタスクは "タスク・マネージャ" に表示できます。タスク・マネージャは、"Caché システム管理ガイド" の “タスク・マネージャの使用” で説明しています。どのような方法でもこれらのタスクを変更しないことをお勧めします。
キューブ・マネージャの概要
キューブ・マネージャを使用すると、キューブ・レジストリを定義できます。これには、現在のネームスペース内のキューブに関する情報が含まれています。特に、構築方法または同期方法あるいはこれら両方に関する情報が含まれています。
キューブ・レジストリでは、一連のキューブ・グループが定義されます。キューブ・グループは、関連性があるまたは同時に更新することを選択したために、同時に更新する必要があるキューブの集合です。キューブ・マネージャに初めてアクセスすると、キューブ・グループの初期セットが表示されます。それぞれの初期キューブ・グループは、1 つのキューブまたは相互に関連付けられている (したがって、グループとして更新する必要がある) 一連のキューブです。必要に応じて、これらの初期キューブ・グループをマージできます。ただし、どの初期キューブ・グループも分割できません。
各キューブ・グループは初期状態では登録されていません。つまり、キューブ・レジストリに組み込まれていません。キューブ・グループを登録 (レジストリに配置) した後、更新計画を定義します。キューブ・マネージャによって、これらの更新計画を使用した自動タスクが作成されます。詳細は、次のセクションを参照してください。
更新計画の概要
キューブ・グループの更新計画によって、キューブの更新方法と更新時期が指定されます。各グループには、既定の計画があり、これを変更できます。グループ内の特定のキューブに対して異なる更新計画を指定することもできます。どちらの場合も、計画の選択肢は以下のとおりです。
-
[構築と同期] — 定期的に再構築します。既定では 1 週間に 1 回です。また、定期的に同期します。既定では 1 日 1 回です。
このオプションは、(この章で前述したように) 指定されたキューブが同期をサポートしていない場合、そのキューブではサポートされません。
-
[構築のみ] — 定期的に再構築します。既定では 1 週間に 1 回です。
-
[同期のみ] — 定期的にキューブを同期します。既定では 1 日 1 回です。
このオプションは、(この章で前述したように) 指定されたキューブが同期をサポートしていない場合、そのキューブではサポートされません。
Important:キューブをキューブ・マネージャから同期する前に、少なくとも一度、キューブ・マネージャからキューブを構築する必要があります。
-
[手動] — キューブ・マネージャから再構築または同期しません。
代わりに、他のツール (アーキテクトの [Build] オプションおよび %BuildCube()、%SynchronizeCube()、%ProcessFact()、%DeleteFact() の各メソッド) の適切な組み合わせを使用します。最後の 3 つのメソッドの詳細は、この章で後述する各セクションを参照してください。
各計画 ([手動] 以外) では、スケジュールの詳細をカスタマイズできます。
任意のネームスペースに対して、キューブ・マネージャは、2 つのタスクを定義します。このネームスペースで要求されたキューブ構築アクティビティをすべて実行するタスクと、このネームスペースで要求されたキューブ同期アクティブティをすべて実行するタスクです。これらのタスクは両方とも、キューブ・レジストリで指定された手順に従います。両方のタスクは、リレーションシップによって要求される正しい順序で自動的にキューブを処理します。
キューブ・マネージャには、登録されたグループおよびキューブそれぞれに対して [除外] チェック・ボックスが用意されていて、これを使用して該当するグループまたはキューブをキューブ・マネージャによるアクティビティから除外できます。具体的には、キューブ・マネージャのタスクでは、除外されたグループおよびキューブは無視されます。最初、これらのチェック・ボックスは選択されています。これは、通常、更新の準備ができるまで、これを実行しないことが適切であるためです。例えば、キューブを構築する前に、DeepSee のエージェント数を調整する必要がある場合があります。
キューブ・マネージャへのアクセス
キューブ・マネージャにアクセスするには、管理ポータルで以下の手順を実行します。
-
以下のように、適切なネームスペースに切り替えます。
-
[変更] をクリックします。
-
ネームスペースをクリックします。
-
[OK] をクリックします。
-
-
[DeepSee] > [管理] > [キューブ管理] > [レジストリ] をクリックします。
-
このネームスペースでキューブ・マネージャを使用したことがない場合、キューブ・レジストリに関する情報の入力を求めるプロンプトが表示されます。この場合、以下の情報を指定します。
-
[キューブ・レジストリのクラス名] — 完全なクラス名 (パッケージを含む) を指定します。このクラス定義は、このネームスペースのキューブ・レジストリになります。
-
[無効] — 必要に応じて、これをクリックしてレジストリを無効にします。レジストリを無効にすると、キューブ・マネージャのタスクは一時停止されます。(まだキューブ・マネージャのタスクはないため、この時点でレジストリを無効にする必要はありません。)
-
[グループの更新] — 相互にグループを更新する方法を指定します。[連続] を選択すると、タスクでは一度に 1 グループが更新されます。[並行] を選択すると、タスクでは並行して複数のグループが更新されます。
-
[この時点以降に構築の開始を可能にする] — 構築可能な最も早い時間を指定します。
これらのすべての詳細は後で変更できます (クラス名を除く)。
そして、[OK] をクリックします。
-
[キューブ・レジストリ] ページが表示されます。このページは 2 つのモードで表示できます ([表示] ボタンを使用)。左の [表示] ボタンをクリックするとツリー表示になり、右の [表示] ボタンをクリックするとテーブル表示になります。
ツリー表示
ツリー表示では、キューブ・マネージャの左側の領域に登録されていないキューブ・グループのツリーが表示されます。以下はその例です。
中央の領域には、登録されたグループに関する情報が記載されたテーブル (初期状態では空) が表示されます。以下の例は、グループ登録後のテーブルの外観を示します。
この領域は、以下のように色分けされます。
-
背景が白 — このグループまたはキューブは包含されています。つまり、キューブ・マネージャのタスクはこれを更新します。この章で後述する “更新計画の指定” の [除外] オプションを参照してください。
-
背景がグレー — このグループまたはキューブは除外されています。つまり、キューブ・マネージャのタスクはこれを無視します。
また、この領域は、以下のように指定されたキューブに基づいてサブジェクト領域を (イタリックで) リストします。
キューブ内の更新内容は、そのキューブに基づいたすべてのサブジェクト領域で自動的に利用可能になるため、サブジェクト領域に対して更新計画を指定することはできません。(このため、サブジェクト領域のベースとなっているキューブとは独立して、そのサブジェクト領域を更新する必要も方法もありません。)
右側の領域では、[詳細] タブ (非表示) に現在の選択肢の詳細が表示されます。このタブは編集できます。[ツール] タブには、他のツールへのリンクが用意されています。
キューブ・マネージャがツリー表示されている場合は、中央領域に表示されるすべての登録済みグループの表示を展開したり折りたたんだりできます。そのためには、中央領域の上部にある [すべて展開] ボタンや [すべて折りたたみ] ボタンを適宜使用します。これらのボタンを使用しても、未登録グループが表示されるページの左側領域は変化しません。
テーブル表示
テーブル表示では、キューブ・マネージャに、現在のネームスペースのすべてのキューブが更新計画とともにリストされます。以下はその例です。
このテーブルは、以下のように色分けされます。
-
背景が白 — このキューブは包含されています。つまり、キューブ・マネージャのタスクはこれを更新します。この章で後述する “更新計画の指定” の [除外] オプションを参照してください。
-
背景がグレー — このキューブは除外されています。つまり、キューブ・マネージャのタスクはこれを無視します。
-
背景がピンク — このキューブは登録されていないため、更新計画がありません。
[グループ名] フィールドは各キューブの所属先のグループを示し、[グループの構築順序] フィールドはグループ内で各キューブが構築または同期される順序を示します。キューブ・マネージャは、登録されたグループ内のキューブに対してのみこの順序を計算します。
右側の領域では、[詳細] タブ (非表示) に現在の選択肢の詳細が表示されます。このタブは編集できます。[ツール] タブには、他のツールへのリンクが用意されています。
レジストリの詳細の変更
キューブ・マネージャに初めてアクセスすると、初期情報の入力を求めるプロンプトが表示されます。これらの詳細を後で変更するには、以下の手順を実行します (レジストリのクラス名を除く。これは変更できません)。
キューブ・グループの登録
キューブ・グループを登録するには、以下の手順を実行します。
-
ツリー表示でキューブ・マネージャを表示します。
-
左側の登録されていないキューブのリストを展開します。
-
この領域から中央の領域の [登録されたグループ] の見出しにグループをドラッグ・アンド・ドロップします。
または、テーブル表示でキューブ・マネージャを表示し、グループ内のキューブの行をクリックし、右側の領域の [登録されたグループ] をクリックします。
どちらの場合でも、変更内容は自動的に保存されます。
更新計画の指定
キューブ・グループおよびそのキューブの更新計画を指定するには、以下の手順を実行します。
-
ツリー表示でキューブ・マネージャを表示します。
-
中央の領域でグループをクリックします。
-
右側の [詳細] ペインで、以下の情報を指定します。
-
[名前] — このグループの一意の名前です。
-
[除外] — 生成されたタスクがこのグループ内のキューブに対して更新アクティビティを実行するかどうかを制御します。初期状態では、このオプションが選択されていて、グループが除外されています。
キューブ・マネージャでは、除外されているグループまたはキューブはグレーの背景で表示されます。
-
[更新計画] — 更新計画を選択します。
キューブ・マネージャでは、(この章で前述したように) キューブが同期をサポートしていない場合、同期の使用は許可されません。例えば、グループに [構築と同期] 計画を選択できますが、同期をサポートしていないキューブに対しては、キューブ・マネージャは、この更新計画を自動的に [Build] に設定します。
Important:キューブをキューブ・マネージャから同期する前に、少なくとも一度、キューブ・マネージャからキューブを構築する必要があります。
-
[構築間隔] — これらのフィールドを使用して、構築タスクのスケジュールを指定します (該当する場合)。
-
[同期間隔] — これらのフィールドを使用して、同期タスクのスケジュールを指定します (該当する場合)。
-
[同期してキューブを構築する] — これを選択すると DeepSee はこれらのキューブを同期して構築します (該当する場合)。このオプションがクリアされている場合、DeepSee は非同期でこれらを構築します。
初期状態では、これらの詳細は、グループ内のすべてのキューブに適用されます。特定のキューブに対する詳細を編集し、後でグループの既定値を再適用する場合、[グループ内のすべてのキューブに適用する] をクリックします。
-
-
必要に応じて、(中央の領域で) このグループ内のキューブをクリックし、右側の [詳細] ペインでそのキューブの情報を編集します。
オプションはグループ全体のものと似ていますが、キューブが同期をサポートしているかどうかに応じて、以下の追加オプションを含みます。
-
[事後構築コード] — このキューブを構築した直後に実行される ObjectScript の 1 行を指定します。以下はその例です。
do ##class(MyApp.Utils).MyPostBuildMethod("transactionscube")
-
[事前同期コード] — このキューブを同期する直前に実行される ObjectScript の 1 行を指定します。以下はその例です。
do ##class(MyApp.Utils).MyPresynchMethod("transactionscube")
必要に応じて、同期を中止するには、コードで以下を実行します。
set $$$ABORTSYNCH=1
-
[事後同期コード] — このキューブを同期した直後に実行される ObjectScript の 1 行を指定します。以下はその例です。
do ##class(MyApp.Utils).MyPostsynchMethod("transactionscube")
いずれの場合でも、コードによって、必要な任意のプロセスを実行できます。
必要に応じて、各キューブを変更します。
-
-
[保存] をクリックします。
これを行うと、キューブ・マネージャは、このネームスペースでキューブ・レジストリを作成または更新します。タスク・マネージャが必要なタスクをまだ組み込んでいない場合、キューブ・マネージャがこれを作成します。
グループのマージ
あるグループ (グループ A) を別のグループ (グループ B) にマージできます。具体的には、グループ A からグループ B にすべてのキューブを移動し、空になったグループ A を削除します。
あるグループを別のグループにマージするには、以下の手順を実行します。この手順では、グループ A はまだ登録されていない必要があり、グループ B は登録されている必要があります。
-
ツリー表示でキューブ・マネージャを表示します。
-
グループ A (移動するキューブが含まれているグループ) を左の領域から、中央の領域にあるグループ B (ターゲット・グループ) のグループ見出しにドラッグ・アンド・ドロップします。
システムからアクションの確認が求められます。
-
[OK] をクリックします。
新しく移動されたキューブの一部で使用できない更新計画がグループ B にある場合、これを示すダイアログ・ボックスが表示されます。[OK] をクリックします。このようなキューブの場合、キューブ・マネージャは、使用できる更新計画を選択します。
-
新しく移動された各キューブに対する更新計画を確認し、必要に応じて変更します。
-
[保存] をクリックします。
または、以下の代替手順を実行してください。この手順では、両方のグループが登録されている必要があります。
-
テーブル表示でキューブ・マネージャを表示します。
-
中央の領域で、グループ A (移動するキューブが含まれているグループ) のキューブの行をクリックします。
-
右側で、[別のグループにマージする] をクリックし、ドロップダウン・リストからグループ B (ターゲット・グループ) を選択します。
-
[マージ] をクリックします。
システムからアクションの確認が求められます。
-
[OK] をクリックします。
新しく移動されたキューブの一部で使用できない更新計画がグループ B にある場合、これを示すダイアログ・ボックスが表示されます。[OK] をクリックします。このようなキューブの場合、キューブ・マネージャは、使用できる更新計画を選択します。
-
新しく移動された各キューブに対する更新計画を確認し、必要に応じて変更します。
-
[保存] をクリックします。
登録されているすべてのキューブの構築
DeepSee には、登録されているキューブをすべて正しい順序で構築するために使用できるユーティリティ・メソッドが用意されています。このメソッドは、クラス %DeepSee.CubeManager.UtilsOpens in a new tab の BuildAllRegisteredGroups() です。このメソッドでは、レジストリで指定されたスケジュールは無視されますが、レジストリで指定された構築順序が使用されます。
キューブをキューブ・マネージャから同期する前に、少なくとも一度、キューブ・マネージャのユーザ・インタフェースからそれらのキューブを構築する必要があります。
オンデマンド構築の実行
キューブ・マネージャでは、オンデマンドで (つまり、スケジュールを無視して) キューブを構築するオプションも提供されます。この種の構築では、キューブ・マネージャは、要求されたキューブおよびこれに依存するすべてのキューブを再構築します。
オンデマンド構築を実行するには、以下の手順を実行します。
-
変更内容をキューブ・レジストリに保存します。
Important:未保存の変更内容があると、構築オプションは無効になります。
-
登録されているキューブを選択します。そのためには、以下のいずれかを実行します。
-
右側で、[除外] オプションをクリアします。
-
[依存関係リストを構築] をクリックします。
キューブ・マネージャで、構築ダイアログ・ボックスが表示されます。
-
[リストの構築] をクリックします。
ダイアログ・ボックスに、構築の進捗状況が表示されます。
-
構築が完了したら、[OK] をクリックします。
オンデマンド構築を実行する方法は他にもあります。
キューブ・グループの登録解除
キューブ・グループを登録解除するには、以下の手順を実行します。
-
ツリー表示でキューブ・マネージャを表示します。
-
中央の領域で、キューブ・グループの行で [X] をクリックします。
-
[OK] をクリックします。
キューブ・マネージャ・イベントの表示
特定のイベントでは、キューブ・マネージャはテーブルにログ・エントリを書き込みます。これは、SQL でクエリできます。テーブル名は、%DeepSee_CubeManager.CubeEvent です。CubeEvent フィールドは、キューブ・イベントのタイプを示します。このフィールドの可能な論理値には、以下が含まれます。
キューブ・イベントの値 | キューブ・マネージャがこのログ・エントリを書き込む時期 |
---|---|
register | キューブ・グループの登録の直後 |
update | キューブ・グループへの変更の保存の直後 |
unregister | キューブ・グループの登録解除の直後 |
build | キューブの構築時キューブ・マネージャは構築の開始直前に初期ログを生成し、構築の完了後にそのエントリを更新します。 |
synch | キューブの同期時キューブ・マネージャは同期の開始直前に初期ログを生成し、同期の完了後にそのエントリを更新します。 |
presynch | [事前同期コード] オプションで指定されたコードの実行直後 |
postsynch | [事後同期コード] オプションで指定されたコードの実行直後 |
postbuild | [事後構築コード] オプションで指定されたコードの実行直後 |
repair | [依存関係リストを構築] オプションの使用時 (このオプションを指定すると、指定されたキューブおよび関連キューブのオンデマンド構築が実行されます)。 キューブ・マネージャは構築の開始直前に初期ログを生成し、構築の完了後にそのエントリを更新します。 |
このテーブルの他のフィールドの詳細は、%DeepSee.CubeManager.CubeEventOpens in a new tab のクラス・リファレンスを参照してください。
キューブ・マネージャへのアクセスの制限
ユーザが [キューブ・レジストリ] ページを使用してキューブの更新スケジュールを変更できないようにして、そのスケジュールを管理することも考えられます。[キューブ・レジストリ] ページへのアクセスを制限するには、保存したキューブ・レジストリ内の RegistryMap オブジェクトまたは RegistryMapGroup オブジェクトで UserUpdatesLocked 属性を "true" に設定します。以下に例を示します。
<RegistryMap Disabled="false" IndependentSync="false" SerialUpdates="false" UserUpdatesLocked="true">
RegistryMap について UserUpdatesLocked を "true" に設定した場合、次のようになります。
-
[詳細] タブを使用してレジストリの [無効] 設定を変更することはできません。このタブにアクセスする方法については、"レジストリの詳細の変更" を参照してください。
RegistryMapGroup について UserUpdatesLocked を "true" に設定した場合、次のようになります。
-
登録された各グループの [除外] チェックボックスは表示されますが、無効になります。
-
登録された各キューブの [除外] チェックボックスは非表示になります。
-
登録された各グループの [更新計画] は非表示になります。
-
登録された各キューブの [更新計画] は非表示になります。
-
登録されたグループを削除するための赤い [X] ボタンは削除されます。
-
[構築頻度] と [同期頻度] の列は空白のままです。
-
[依存関係リストを構築] をキューブで使用することはできますが、[このグループを構築] ボタンは無効になります。
%SynchronizeCube() の使用
プログラムでキューブを同期するには (つまり、キューブ・マネージャを使用しない)、%DeepSee.UtilsOpens in a new tab クラスの %SynchronizeCube() メソッドを呼び出します (これには以下のシグニチャがあります)。
classmethod %SynchronizeCube(pCubeName As %String, pVerbose As %Boolean = 1) as %Status
指定されているキューブ (pCubeName) に対して、このメソッドは前回の呼び出しより後に行われたすべての変更をソース・データから検出して適用します。
pVerbose が True の場合、メソッドはステータス情報をコンソールに書き込みます。このメソッドのその他の引数については、クラスリファレンスOpens in a new tabを参照してください。
%SynchronizeCube() は、以下の方法のいずれかで呼び出すことができます。
-
メソッドをベース・クラスのデータを変更するコードの一部から呼び出します。
これは、Patients サンプル内で使用されている方法です。
-
定期的に、%SynchronizeCube() を繰り返しのタスクとして呼び出します。
%SynchronizeCube() によって、No changes detected というメッセージが表示された場合、これは、キューブを再構築したことがないことを示しています。
DSTIME の削除
これまでの経緯と便宜上の理由から、DSTIME の削除という表現は、^OBJ.DSTIME グローバルから古いエンティティを削除することを表します。このグローバルは、かなり大きくなることがあるため、定期的に削除する必要があります。
リリース 2017.2 時点では、特定のキューブの DSTIME を削除するには、以下の操作を実行します。
-
REST API の /Data/GetDSTIME を呼び出します。"DeepSee Web クライアントを作成するためのツール" の “GET /Data/GetDSTIME” を参照してください。引数として、キューブのソース・クラスのフルネームを渡します。
この REST 呼び出しは、特定のサーバ上でそのソース・クラスに対して処理された最後の ^OBJ.DSTIME タイムスタンプを返します。非同期ミラー設定の場合、この REST サービスから取得したタイムスタンプは、プライマリ・プロダクション・サーバで安全に削除できる直近のタイムスタンプになります。
-
返されたタイムスタンプを引数として使用して、%DeepSee.UtilsOpens in a new tab の %PurgeUpdateBuffer() メソッドを呼び出すことで、リモート・サーバで処理されたタイムスタンプ未満の ^OBJ.DSTIME を削除します。このメソッドの既定の動作では、ローカルの ^OBJ.DSTIME の最上位ノードが増分されます。これにより、DeepSee サーバに伝播される新しい同期ポイントが削除のたびに提供されるようになります。
キューブの手動更新
“キューブの同期が不可能なとき” で説明したように、キューブを手動で更新する必要がある場合があります。このような場合、アプリケーションで以下のことを実行する必要があります。
-
ベース・クラス内の影響を受けるレコードの ID を判断する。
-
%DeepSee.UtilsOpens in a new tab の %ProcessFact() および %DeleteFact() メソッドを呼び出すことで、それらのレコードに対してキューブを更新する。
入力として、これらのメソッドには影響を受ける行の ID が必要です。
以下のリストにこれらの方法に関する情報が用意されています。
classmethod %ProcessFact(pCubeName As %String,
pSourceId As %String = "",
pVerbose As %Boolean = 0) as %Status
pCubeName はキューブの論理名、pSourceID はそのキューブで使用されるベース・クラス内のレコードの ID です。指定されたキューブに対して、このメソッドはファクト・テーブルの対応する行、関連付けられたインデックス、および影響を受ける場合はレベル・テーブルを更新します。
pVerbose が True の場合、メソッドはステータス情報をコンソールに書き込みます。
classmethod %DeleteFact(pCubeName As %String,
pSourceId As %String = "",
pVerbose As %Boolean = 0) as %Status
pCubeName はキューブの論理名、pSourceID はそのキューブで使用されるベース・クラス内のレコードの ID です。指定されたキューブに対して、このメソッドはファクト・テーブルの対応する行を削除し、それに応じてインデックスを更新します。
pVerbose が True の場合、メソッドはステータス情報をコンソールに書き込みます。
その他のオプション
このセクションでは、その他の高度なオプションまたはあまり一般的でないオプションについて説明します。
DSTIME=MANUAL を使用する方法
DeepSee で ^OBJ.DSTIME グローバルを自動的に更新する代わりに、ユーザが選択した時間にこのグローバルを更新することができます。そのためには、以下の操作を実行します。
-
DSTIME を、"AUTO" ではなく "MANUAL" に指定します。
-
その後、アプリケーション内で、%DeepSee.UtilsOpens in a new tab クラスのオブジェクトを追加、変更、または削除するたびにこのクラスの %SetDSTimeIndex() メソッドを呼び出します。
このメソッドには、以下のシグニチャがあります。
ClassMethod %SetDSTimeIndex(pClassName As %String, pObjectId As %String, pAction As %Integer, pInterval As %Integer = 0)
以下は、この指定の説明です。
-
pClassName は、追加、変更、または削除したオブジェクトの完全なパッケージとクラスの名前です。
-
pObjectId は、そのオブジェクトのオブジェクト ID です。
-
pAction は、オブジェクトを更新した場合は 0、追加した場合は 1、削除した場合は 2 です。
-
pInterval はオプションの整数です。これを正の整数として指定する場合、DeepSee は ^OBJ.DSTIME グローバルおよび ^DeepSee.Update グローバルでタイムスタンプ・サブスクリプトを使用します。“キューブ同期の有効化” の DSINTERVAL パラメータの説明を参照してください。
-
次に、指定のキューブを更新する場合、前述のように %DeepSee.UtilsOpens in a new tab クラスの %SynchronizeCube() メソッドを呼び出します。
ファクト・テーブルへのファクトの挿入
まれに、どのソース・レコードとも対応しないレコードを含むファクト・テーブルが必要なことがあります。その場合は、キューブ・クラスの %InjectFact() メソッドを使用します。
このメソッドには、以下のシグニチャがあります。
classmethod %InjectFact(ByRef pFactId As %String,
ByRef pValues As %String,
pDimensionsOnly As %Boolean = 0)
as %Status
以下は、この指定の説明です。
-
pFactId は、ファクトの ID です。これを "" (挿入を表します) に設定します。この引数が返されるときに、ファクトで使用される ID が格納されます。
-
pFactId は、ファクト値の多次元配列です。この配列では、添え字は sourceProperty 名 (大文字と小文字の区別あり) です。
-
pDimensionsOnly では、このメソッドがファクト・テーブルとディメンジョン・テーブルの両方に影響するか、ディメンジョン・テーブルのみに影響するかを制御します。この引数が True の場合、このメソッドはディメンジョン・テーブルにのみ影響します。この引数は、次のセクションの説明に従ってディメンジョンを事前構築する場合に使用します。
ディメンジョン・テーブルの事前構築
既定では、ファクト・テーブルが構築されると同時に、ディメンジョン・テーブルにデータが入力されます。ファクト・テーブルより前にディメンジョン・テーブルにデータが入力されるように (何らかの理由でこれが必要な場合)、1 つまたは複数のディメンジョン・テーブルを事前構築できます。
1 つまたは複数のディメンジョン・テーブルを事前構築するには、以下の手順を実行します。
-
キューブ定義クラスに %OnBuildCube() コールバックを実装します。このメソッドには、以下のシグニチャがあります。
classmethod %OnBuildCube() as %Status
%BuildCube() メソッドは、古いキューブ・コンテンツを削除した直後、新しいコンテンツの処理を開始する前にこのメソッドを呼び出します。
-
この実装では、キューブ・クラスの %InjectFact() メソッドを呼び出して、pDimensionsOnly 引数を True に指定します。
このメソッドの詳細は、前のセクションを参照してください。
例えば、以下の部分実装では、HoleFoods サンプルの Cities ディメンジョンが事前定義されています。
ClassMethod %OnBuildCube() As %Status
{
// pre-build City dimension
Set tVar("Outlet.Country.Region.Name") = "N. America"
Set tVar("Outlet.Country.Name") = "USA"
Set tVar("Outlet") = 1000
Set tVar("Outlet.City") = "Cambridge"
Do ..%InjectFact("",.tVar,1)
Set tVar("Outlet") = 1001
Set tVar("Outlet.City") = "Somerville"
Do ..%InjectFact("",.tVar,1)
Set tVar("Outlet") = 1002
Set tVar("Outlet.City") = "Chelsea"
Do ..%InjectFact("",.tVar,1)
Quit $$$OK
}
メモ :
-
メンバの名前のほかに一意の ID も指定する必要があります。
-
完全を期すために、このコードでは市の人口、経度、および緯度も指定する必要があります。これは、対応するディメンジョン・テーブルにはこれらの値が格納されているためです。
-
また、より高レベルのメンバの値を指定する必要もあります。
手動でのディメンジョン・テーブルの更新
場合によっては、ベース・クラスに変更がなくても、レベルとして使用される検索テーブルに変更があることがあります。そのような場合、この章で前述した方法のいずれかでキューブを更新できます。ただし、1 つのディメンジョン・テーブルを変更するだけであれば、そのレベルのテーブルを直接更新する方が簡単です。これには、%DeepSee.UtilsOpens in a new tab の %UpdateDimensionProperty() メソッドを使用します。
このメソッドには、以下のシグニチャがあります。
classmethod %UpdateDimensionProperty(pCubeName As %String,
pSpec As %String,
pValue As %String,
pKey As %String)
as %Status
以下は、この指定の説明です。
-
pCubeName は、キューブの名前です。
-
pSpec は、更新するレベル・メンバを参照する MDX メンバ式です。この式では、ディメンジョン、階層、およびレベルの識別子を使用する必要があります。例 : "[docd].[h1].[doctor].&[61]"
バリエーションとして、pSpec はメンバのプロパティへの参照とすることができます。例 : "[homed].[h1].[city].&[Magnolia].Properties(""Principal Export"")"
DeepSee では、この引数と pCubeName 引数を使用して、更新するテーブルと行を確定します。
-
pValue は、このメンバの新しい名前です (存在する場合)。
また、メンバのプロパティを指定した場合は、pValue がそのプロパティの新しい値として使用されます。
-
pKey は、このメンバの新しいキーです (存在する場合)。
この引数は、pSpec のメンバを指定した場合のみ指定します。
このメソッドを使用して、以下の 3 種類の変更を行うことができます。
-
メンバの新しいキーを指定する。以下はその例です。
Set tSC = ##class(%DeepSee.Utils).%UpdateDimensionProperty("patients","[docd].[h1].[doctor].&[186]",,"100000")
既定では、キーは名前としても使用されます。そのため、このアクションによって名前も変更されることがあります。
-
メンバの新しい名前を指定する。以下はその例です。
Set tSC = ##class(%DeepSee.Utils).%UpdateDimensionProperty("patients","[docd].[doctor].&[186]","Psmith, Alvin")
既定では、名前はキーです。そのため、このアクションによってキーも変更されることがあります。
-
他のプロパティの新しい値を指定する (Name と Key はどちらもプロパティです)。以下はその例です。
Set memberprop="homed.h1.city.Pine.Properties(""Principal Export"")" Set tSC = ##class(%DeepSee.Utils).%UpdateDimensionProperty("patients",memberprop,"Sandwiches")
例
Patients サンプルには、データを変更し、同期または手動更新を必要に応じて使用するユーティリティ・メソッドが含まれています。それらのメソッドを試すには、このサンプルで提供されているダッシュボードを使用できます。
-
SAMPLES ネームスペースでユーザ・ポータルを開きます。
-
Real Time Updates ダッシュボードをクリックします。
-
左上の領域にあるボタンをクリックします。これらのボタンのそれぞれが、このサンプル内のデータをランダムに変更するメソッドを実行する KPI アクションを実行します。アクションは、バックグラウンド・プロセスを開始する JOB を使用してメソッドを起動します。
-
[患者を追加] では、患者が追加されます。
このアクションは、患者を追加するたびに %SynchronizeCube() を呼び出しながら 100 人の患者を追加するメソッドを呼び出します。
-
[患者グループの変更] では、一部の患者に対する患者グループの割り当てが変更されます。
このアクションは、一定の割合の患者について患者グループの割り当てをランダムに変更し、その変更のたびに %SynchronizeCube() メソッドを呼び出すメソッドを呼び出します。
-
[一部の患者を削除] では、一部の患者が削除されます。
このアクションは、患者を削除するたびに %SynchronizeCube() を呼び出しながら 1% の患者を削除するメソッドを呼び出します。
-
[好きな色を変更] では、一部の患者の好みの色が変更されます。
このアクションは、一定の割合の患者の好みの色をランダムに変更するメソッドを呼び出します。この場合、変更されたデータは DeepSee_Study.PatientDetails テーブルに格納されますが、このテーブルは Patients キューブのベース・テーブルではありません。したがって、%SynchronizeCube() の代わりに %ProcessFact() を使用する必要があります。
このメソッドには以下のコード・ブロックが含まれています。
Set patID=patdetails.PatientID Set myquery="SELECT ID FROM DeepSee_Study.Patient WHERE PatientID=?" Set rset=##class(%ResultSet).%New("%DynamicQuery:SQL") Set status=rset.Prepare(myquery) If $$$ISERR(status) {Do $System.Status.DisplayError(status) Quit} Set status=rset.Execute(patID) If $$$ISERR(status) {Do $System.Status.DisplayError(status) Quit} While rset.Next() { Set id=rset.Data("ID") Do ##class(%DeepSee.Utils).%ProcessFact("patients",id) }
このコード・ブロックは、データの変更によって影響を受けるすべての患者を返す SQL クエリを実行します。その後、それらの患者を繰り返し処理し、患者ごとに Patients キューブを更新します。
-
[受診を追加] では、一部の患者の受診が追加されます。
このアクションは、DeepSee.Study.PatientDetailsOpens in a new tab の場合と同様のロジックを含むメソッドを呼び出します (前の項目を参照してください)。
-
[医者グループの変更] では、一部の一次診療医で医者グループの割り当てが変更されます。
このアクションは、DeepSee.Study.PatientDetailsOpens in a new tab の場合と同様のロジックを含むメソッドを呼び出します。
-
これらのメソッドは、ログの詳細を ^DeepSee.Study.Log グローバルに書き込みます。以下はその例です。
^DeepSee.Study.Log(1)="13 May 2011 05:29:37PM Adding patients..."
^DeepSee.Study.Log(2)="13 May 2011 05:29:38PM Current patient count is 10200"