Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

キューブのコンパイルとビルド

この章では、キューブをコンパイルおよびビルドする方法について説明します。ここでは、以下のトピックについて説明します。

Note:

構築プロセス中、ユーザはクエリを実行できません。(ただし、クエリを現在実行中の場合は、キューブをビルドできます)。

以下の関連トピックについては、"DeepSee 実装ガイド" を参照してください。

  • キューブの同期。このプロセスでは、キューブがインクリメンタルに更新されます (また、クエリの同時実行が許可されます)。上記のドキュメントの “キューブの最新状態の維持” の章を参照してください。

  • DeepSee キューブ・マネージャ・ユーティリティ。これは通常、プロダクション・システムで使用します。キューブ・マネージャは、指定に従ってキューブを構築または同期する自動化タスクを作成します。上記のドキュメントの “キューブの最新状態の維持” の章を参照してください。

  • キューブ・バージョン機能。この機能を使用すると、実行中クエリのわずかな中断しか伴わずに、キューブ定義の変更、構築、ユーザへの提供を行うことができます。上記のドキュメントの付録 “キューブ・バージョンの使用” を参照してください。

リコンパイルおよび再構築のタイミング

キューブ・クラスまたはサブジェクト領域クラスに変更を加える場合、その変更を有効にするには、そのクラスをリコンパイルする必要があります。キューブに多数の変更がある場合、その変更を有効にするには、キューブも再構築する必要があります。

以下のテーブルは、変更の後に必要なアクションを示しています。

要素タイプ 変更のタイプ 必要なアクション
キューブ (ルート要素) [名前] または [ソースクラス] の編集 リコンパイルおよび再構築
キューブに適用するがキューブ内の特定の要素には適用しないその他の変更 リコンパイル
メジャー 既存のメジャーの以下のオプションの編集 (その他多くの要素にこれらの共通オプションの一部または全部があります)
  • 無効

  • [隠し]

  • 表示名

  • 説明

  • 形式文字列

リコンパイル
メジャーの追加や削除など、その他のすべての変更 リコンパイルおよび再構築
ディメンジョン (計算ディメンジョン以外) 既存のディメンジョンの以下のオプションの編集
  • “メジャー” の場合と同じ共通オプション

  • このディメンジョンの All レベルの有効化

  • All メンバのキャプション

  • All メンバの表示名

リコンパイル
ディメンジョンの追加や削除など、その他のすべての変更 リコンパイルおよび再構築
計算ディメンジョン すべての変更 リコンパイル
iKnow ディメンジョン すべての変更 リコンパイル
階層 既存の階層の共通オプションの編集 (“メジャー” の場合と同様) リコンパイル
階層の追加や削除など、その他のすべての変更 リコンパイルおよび再構築
レベル 既存のレベルの以下のオプションの編集
  • “メジャー” の場合と同じ共通オプション

  • ヌル置換文字列

  • 並べ替えオプション

リコンパイル
レベルの追加や削除など、その他のすべての変更* リコンパイルおよび再構築
プロパティ 既存のプロパティの以下のオプションの編集
  • “メジャー” の場合と同じ共通オプション

  • プロパティ値を基準にしたメンバの並べ替え

リコンパイル
プロパティの追加や削除など、その他のすべての変更 リコンパイルおよび再構築
リスト すべての変更 リコンパイル
計算メンバ すべての変更 リコンパイル
名前付きセット すべての変更 リコンパイル
サブジェクト領域 すべての変更 リコンパイル
複合キューブ (サブジェクト領域の一種) すべての変更 リコンパイル (複合キューブ内で使用されるすべてのキューブのリコンパイル)
品質メジャー すべての変更 品質メジャー・クラスのリコンパイル
KPI またはプラグイン すべての変更 KPI クラスまたはプラグイン・クラスのリコンパイル

*現在のサーバ・ロケールによって時間ディメンジョンのメンバの名前が決まります。(このドキュメントで後述する “ロケールを使用した時間メンバ名の制御” を参照してください。)ロケールを変更した場合は、キューブをリコンパイルおよび再構築する必要があります。

キューブのコンパイル

アーキテクトでキューブ・クラスをコンパイルする手順は以下のとおりです。

  1. [コンパイル] をクリックします。

    クラスのコンパイルが開始され、進捗状況を示すダイアログ・ボックスが表示されます。

    保存していない変更がある場合は、キューブをコンパイルする前に、システムによって変更が保存されます。

  2. [OK] をクリックします。

または、スタジオでキューブ・クラスを開き、他のクラスのコンパイルと同じ方法でこれをコンパイルします。

キューブ・クラスをコンパイルする際には、必要に応じてファクト・テーブルとすべての関連クラスが自動的に生成されます。ファクト・テーブルが既に存在する場合、構造を変更する必要がある場合にのみ、システムによりファクト・テーブルが再生成されます。

このキューブにキャッシュされた結果が存在する場合、これらはシステムにより削除されます。

キューブの構築

キューブの構築という用語は、ファクト・テーブルおよびその他のテーブルへのデータの追加と、このデータへのアクセスに使用されるインデックスの構築の 2 つのタスクを指します。

アーキテクトでキューブを構築する手順は以下のとおりです。

  1. [ビルド] をクリックします。

    ダイアログ・ボックスが表示されます。

  2. 必要に応じて、[構築する最大レコード数] の値を指定します。

    既定では、DeepSee は、ソース・テーブル内のすべてのレコードの繰り返し処理を行い、同じ数のレコードをファクト・テーブルに構築します。キューブ作成時にこの動作をオーバーライドできます。[構築する最大レコード数] オプションを指定すると、DeepSee はその数のレコードだけを繰り返し処理します。その結果、DeepSee は、より素早くより小さいファクト・テーブルを構築します。

    [構築する最大レコード数] フィールドがある数値で初期化されると、キューブ・クラスは既定の動作をオーバーライドします (詳細は、付録 “キューブ・クラスのリファレンス情報” の <cube>maxFacts 属性を参照してください)。この場合、キューブ・クラスで指定された値を使用するか、またはより小さい値を入力できます。

  3. [ビルド] をクリックします。

    キューブの構築が開始され、その進捗状況が表示されます。

  4. [完了] をクリックします。

これで、"DeepSee アナライザの使用法" で説明されているようにキューブの使用が可能になります。

プログラムによるキューブのビルド

キューブをプログラムでビルドするには、%DeepSee.UtilsOpens in a new tab クラスの %BuildCube() クラス・メソッドを実行します。このメソッドには、以下のシグニチャがあります。

classmethod %BuildCube(pCubeName As %String, pAsync As %Boolean = 1, pVerbose As %Boolean = 1, pIndexOnly As %Boolean = 1, pMaxFacts As %Boolean = 0, pTracking As %Boolean = 0, ByRef pBuildStatistics As %String = "") as %Status

以下は、この指定の説明です。

  • pCubeName は、XData ブロックで指定されているキューブの論理名です。この名前は大文字と小文字が区別されません。

  • pAsync は、DeepSee が複数のバックグラウンド・プロセスでビルドを実行するかどうかを制御します。この引数が true の場合、システムは複数のプロセスを使用し、それらがすべて完了するまで戻りません。この引数が false の場合、システムは単一のプロセスを使用し、それが完了するまで戻りません。

    Note:

    キューブ・オプションの [初期ビルド順] を指定している場合、DeepSee は pAsync の値を無視し、単一プロセスを使用してキューブをビルドします。これらのオプションについては、このドキュメントで前述の “キューブ・オプションの指定” に説明があります。

  • pVerbose は、メソッドがステータス情報を書き込むかどうかを制御します。この引数が 1 の場合は、コマンド行に状態の更新が書き込まれます。(この引数は、メソッドが構築エラーやその他のロギング情報を書き込むかどうかに影響しません。)

  • pIndexOnly は、メソッドがインデックスのみを更新するかどうかを制御します。この引数が 1 の場合は、システムはファクト・テーブルのインデックスのみを更新します。

  • pMaxFacts は、ファクト・テーブルの最大行数を指定します。これによって、キューブの構築時に使用されるベース・テーブルの行数が決まります。

    pMaxFacts が 0 の場合 (既定)、ベース・テーブルのすべての行が処理されます。

  • pTracking は内部用です。

  • pBuildStatistics は、キューブの構築に関する情報の配列を返します。この配列には以下のノードがあります。

    ノード
    pBuildStatistics(“elapsedTime”) 構築の経過時間 (秒単位)。
    pBuildStatistics(“errors”) 構築エラーの数。
    pBuildStatistics(“factCount”) 構築およびインデックス付けされたファクトの数。
    pBuildStatistics(“missingReferences”) 欠落している参照の数。
    pBuildStatistics(“expressionTime”) キューブ要素を構築する sourceExpressions の処理にかかった時間。
    pBuildStatistics(“iKnowTime”) iKnow インデックスの構築にかかった時間。

このメソッドはステータスを返します。キューブの構築中にエラーが発生した場合は、ステータス・コードにより構築エラーの数が示されます。

以下はその例です。

 set status = ##class(%DeepSee.Utils).%BuildCube("patients")

このメソッドは、以下の情報を示す出力を記述します。

  • 使用されるプロセッサの数。

  • 構築プロセスに要する経過時間の合計。

  • ソース式を評価するために費やした時間の合計 (すべてのプロセッサの総合計)。

以下はその例です。

 
Building cube [patients]
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:                  1.791514s
Source expression time:        0.798949s

Source expression time が大きすぎると考えられる場合は、ソース式ができる限り効率的であることを再検査する必要があります。特に、その式で SQL クエリを使用している場合は、そのクエリが使用するテーブルに適切なインデックスがあることを再度確認してください。

開発におけるキューブ・サイズの最小化

キューブの開発時は、一般にリコンパイルと再構築を頻繁に行います。大量のデータ・セットを使用している場合は、キューブをより迅速に再構築するため、ファクト・テーブル内のファクト数を制限することがあります。これを行うには、以下のいずれかを実行します。

  • アーキテクトでキューブを構築する場合は、[構築する最大レコード数] の値を指定します。

  • スタジオでキューブ・クラスを編集して、maxFacts 属性を <cube> 要素に追加します。付録 “キューブ・クラスのリファレンス情報” を参照してください。

    これを実行する場合は、この属性を導入前に確実に削除してください。

  • ターミナルでキューブを構築して、pMaxFacts 引数を指定します。この章で前述の “ターミナルでのキューブの構築” を参照してください。

キューブの構築時の並行処理の使用法

以下のすべての項目が該当する場合、DeepSee はビルドの実行に複数のコアを使用します。

  • キューブの構築時に pAsync を 1 に指定している (“プログラムによるキューブのビルド” を参照)。

  • キューブのソースが永続クラスである (データ・コネクタではない)。データ・コネクタについては、"DeepSee 実装ガイド" で説明しています。

  • 永続クラスがビットマットに適している。

  • キューブの [初期ビルド順] オプションが設定されていない。これらのオプションについては、このドキュメントで前述の “キューブ・オプションの指定” に説明があります。

エージェント数の指定

キューブを非同期的に構築するときに、並列処理が使用できる場合、その作業を実行するために DeepSee はエージェントのプールを設定します。このプールは、一連の優先度の高いエージェントと、同じ数の優先度の低いエージェントで構成されます。既定では、優先度の高いエージェント (または優先度の低いエージェント) の総数は、DeepSee が動作しているマシン上で検出されたコアの数の 4 倍です。

Note:

これらのエージェントは、クエリの実行にも使用されます。

別のエージェント数を指定するには、クラス %DeepSee.UtilsOpens in a new tab のクラス・メソッド %SetAgentCount() を呼び出します。引数は以下のいずれかである必要があります。

  • 優先度の高いエージェントの必要数 — つまり、必要な総エージェント数の半数。

  • NULL — 既定の動作をリストアする場合。

このメソッドは、優先度の高いエージェントの現在の数を返します。つまり、総エージェント数の半数です。または、NULL を返すこともあります。これは、既定の動作が有効であることを意味します。

例えば、以下のコマンドは、総エージェント数を 10 に設定します。

 d ##class(%DeepSee.Utils).%SetAgentCount(5)

エージェントの現在の数を確認するには、同じクラスの %GetAgentCount() メソッドを使用します。このメソッドは、優先度の高いエージェントの現在の数を返します。または、NULL を返すこともあります。これは、既定の動作が有効であることを意味します。

エージェントの実行中は、それらのエージェントを個別のプロセスとして管理ポータルに表示することができます。これらを表示するには、[システム処理] をクリックしてから、[プロセス] をクリックします。%DeepSee.TaskMasterOpens in a new tab ルーチンのインスタンスを探します。これらは、自動的にはシャットダウンされませんが、アイドル時にリソースを消費することはありません。

まれに、これらのエージェントのリセットが必要になることがあります。この操作には、%Reset()%DeepSee.UtilsOpens in a new tab メソッドを使用します。また、このメソッドは、保留中のタスクを消去して、現在のネームスペースの結果キャッシュを消去します。これらは、すべてのユーザに直ちに影響を与えます。このメソッドは、開発時にのみ使用するように意図されています。

構築エラー

キューブの構築の際は、表示されるエラー・メッセージ、および構築されるファクトとインデックスの数に注意してください。このセクションでは、以下の項目について説明します。

トラブルシューティング・オプションの詳細は、InterSystems Developer CommunityOpens in a new tab を参照してください。

構築エラーの確認

アーキテクトまたはターミナルでキューブを構築する際、構築エラーが存在するかどうかが DeepSee により示されます。以下に例を示します。

generated description: arch build status

このユーザ・インタフェースには、一部の構築エラーが表示されません (ターミナルでキューブを構築する際も同様です)。

記録された構築エラーをすべて確認するには、以下のいずれかを実行します。

  • ログ・ファイル install-dir/mgr/DeepSeeUpdate_cube_name_NAMESPACE.log を探します。cube_name はキューブ名で、NAMESPACE はこのキューブが定義されているネームスペースです。

    このファイルのタイム・スタンプでは $NOW を使用してローカルの日時が記録されます。サマータイムは無視されます。

  • 以下のように、%DeepSee.UtilsOpens in a new tab%PrintBuildErrors() メソッドを使用します。

    do ##class(%DeepSee.Utils).%PrintBuildErrors(cubename)
    

    cubename はキューブの論理名で、引用符で囲みます。

    このメソッドはすべての構築エラーに関する情報を表示します。以下に例を示します (改行が追加されています)。

    SAMPLES>do ##class(%DeepSee.Utils).%PrintBuildErrors("patients")
        1   Source ID: 13
            ERROR #5001: Error inserting/updating fact: (Source ID:'13') 
    Field 'DeepSee_Model_PatientsCube.Fact.Dx3295243289' (value 'abc') failed validation
     
        2   Source ID: 22
            ERROR #5001: Error inserting/updating fact: (Source ID:'22') 
    Field 'DeepSee_Model_PatientsCube.Fact.Dx3295243289' (value 'abc') failed validation
     
        3   Source ID: 37
            ERROR #5001: Error inserting/updating fact: (Source ID:'37') 
    Field 'DeepSee_Model_PatientsCube.Fact.Dx3295243289' (value 'abc') failed validation
    ...
    81 build error(s) for 'patients'
    
Important:

DeepSee によりエラーが生成されない場合もあるため、ファクト数の確認も重要です (次のセクションを参照)。

ファクト数の確認

キューブの構築の際は、構築されるファクトとインデックスの数が報告されます。例えば、アーキテクトでは以下のようになります。

generated description: arch build status

各ファクトは、ファクト・テーブル内のレコードです。以下の場合を除き、ファクト・テーブルには、ベース・テーブルと同じ数のレコードが存在します。

また、DeepSee でインデックスが構築されると、インデックス数がファクト・テーブルのレコード数と同じになります。例えば、アーキテクトでは [ファクトの構築中][インデックス構築中] に同じ数が示されます。これらの数に不一致がある場合は、ログ・ファイルを確認してください。

考えられる構築エラーの原因

構築エラーファクト数の原因不明の不一致が存在する場合は、以下の手順を実行します。

  1. 範囲式を使用するすべてのレベルを調べ、これらのレベルでレコードが削除されていないことを検証します。このドキュメントで後述の “レベルの検証” を参照してください。

    この種のエラーは、インデックス数に影響しますが、ファクト数には影響しません。

  2. 選択したディメンジョンまたはメジャーを無効にします。その後、リコンパイルおよび再構築を行い、問題が発生するディメンジョンまたはメジャーを隔離します。

<STORE> エラー

構築ログに、以下のようなエラーが記載される場合があります。

ERROR #5002: Cache error: <STORE>%ConstructIndices+44^Cube.cube_name.Fact.1

このエラーは、レベルに非常に大量のメンバが存在する場合に発生します。既定では、DeepSee はインデックスを構築する際、ローカル・メモリを使用してインデックスをチャンクで格納し、その後それらをディスクに書き込みます。レベルに非常に大量のメンバが含まれる場合は、ローカル・メモリが不足し、<STORE> エラーが発生することがあります。

このようなエラーを回避するには、以下のいずれかの操作を実行します。

  • キューブを単一のプロセスで構築する。そのためには、ターミナルで %BuildCube() を使用し、2 番目の引数に 0 を使用します。

  • <cube> 要素で、bitmapChunkInMemory="false" (既定) を指定する。バックグラウンド・プロセスを使用してこのキューブを構築すると、ローカル変数ではなくプロセス・プライベート・グローバルが使用されます (ローカル・メモリによる制限がなくなります)。

参照の欠落エラー

キューブが他のキューブへのリレーションシップを持つ場合、構築ログに、以下のようなエラーが記載される場合があります。

ERROR #5001: Missing relationship reference in RelatedCubes/Patients: source ID 1 missing reference to RxHomeCity 4

このエラーは、キューブが間違った順序で構築されていることを示す可能性があります。"DeepSee 上級モデリング・ガイド" の “リレーションシップを持つキューブの構築” を参照してください。キューブ・マネージャを使用する場合、キューブ・マネージャが適切な構築順序を決定することに注意してください。

missing relationship reference エラーは、キューブの構築プロセス中に新しいソース・データが使用可能になる場合、つまり既にキューブのいくつかが構築された後にも発生する可能性があります。例えば、サンプル・キューブ RelatedCubes/CitiesRelatedCubes/Patients について考えてみましょう (これらは SAMPLES ネームスペースで使用可能です)。キューブ RelatedCubes/Cities を構築した後、RelatedCubes/Patients のソース・テーブルが、新しい都市を使用するレコードを受け取るとします。この場合、キューブ RelatedCubes/Patients を構築すると、missing relationship reference エラーが発生します。

キューブを正しい順序で構築したことが確実である場合、エラーからの回復の詳細について、次のセクションを参照してください。

構築エラーからの回復

DeepSee は、キューブ全体を再構築するよりも、以前に構築エラーを生成したレコードのみ再構築する方法を提供します。以下はその方法です。

  1. これらのエラーの原因となる問題を修正します。

  2. 以下のように、%DeepSee.UtilsOpens in a new tab%FixBuildErrors() メソッドを使用します。

    set sc=##class(%DeepSee.Utils).%FixBuildErrors(cubename)
    

    cubename はキューブの論理名で、引用符で囲みます。このメソッドは、進捗状況メッセージを表示するかどうかを指定する 2 番目の引数を受け入れます。この引数の既定値は True です。

    例えば以下のように出力されます。

    Fact '100' corrected
    Fact '500' corrected
    Fact '700' corrected
     
     
    3 fact(s) corrected for 'patients'
    0 error(s) remaining for 'patients'
    

    または、キューブ全体を再構築します。

DeepSee タスク・ログ

DeepSee は、(前述した構築ログ以外に) 他のログ・ファイルも生成します。キューブを構築した後、またはキューブを構築しようとした後、DeepSee は、install-dir/mgr ディレクトリに DeepSeeTasks_NAMESPACE.log ファイルも書き込みます。このファイルには、構築プロセス中に DeepSee が使用したバックグラウンド・エージェントに関する情報が記載されます。以下に例を示します。

2009-11-04 16:53:35.648       2312 TaskMaster Background agents killed
2009-11-04 16:53:35.663       2312 TaskMaster Create background agents..
2009-11-04 16:53:35.739       6900 TaskMaster Agent started:1
...
2009-11-04 16:54:19.561       2312 TaskMaster Background agents killed

このファイルを管理ポータルから参照するには、[DeepSee] > [ツール] > [DeepSee ログ] の順に選択します。

Tip:

このファイルには、リストのエラーや KPI エラーなど、さまざまな種類の実行時エラーに関する情報も含まれます。

このファイルのタイム・スタンプではローカルの日時を使用します (サマータイムは考慮されます)。

FeedbackOpens in a new tab