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?

はじめに

多次元ストレージ・エンジンは、Caché の主な機能の 1 つです。この機能により、アプリケーションはデータをコンパクトで効率的な多次元スパース配列に格納できます。このような配列はグローバルと呼ばれます。

ここでは以下の説明を行います。

特徴

グローバルは、永続多次元配列での簡単なデータ格納法を提供します。

例えば、Settings というグローバルを使用して、値 “Red” を キー “Color” と関連付けます。

   SET ^Settings("Color")="Red"
   WRITE !,^Settings("Color")

グローバルの多次元性を利用して、さらに複雑な構造の定義が可能となります。

^Settings("Auto1","Properties","Color") = "Red"
^Settings("Auto1","Properties","Model") = "SUV"
^Settings("Auto2","Owner") = "Mo"
^Settings("Auto2","Properties","Color") = "Green"

グローバルには以下の機能があります。

  • 使用の容易性 — グローバルは、他のプログラミング言語の変数と同様に使用が簡単です。ObjectScript 言語と Caché Basic スクリプト言語のいずれにも包括的なコマンドがあるため、アプリケーション内でグローバルを簡単に使用できます。

  • 多次元 — 任意の添え字を使用して、グローバルでノードのアドレスを指定できます。例えば ^Settings("AUTO2","Properties","Color") の場合、添え字 ColorSettings グローバルで 3 番目のノードになります。添え字は、整数、数値、あるいは文字列値で、連続している必要はありません。

  • スパース — グローバル・ノードのアドレス指定をするための添え字は非常にコンパクトで、連続した値を持つ必要はありません。

  • 効率的 — グローバルでの処理 (挿入、更新、削除、走査、検索) はすべて、最高のパフォーマンスと並行処理のために高度に最適化されています。他にも、特定の操作に対応するためのコマンドがあります (データの一括挿入など)。また、記録のソートなど一時的なデータ構造のための特別仕様グローバルもあります。

  • 信頼性 — Caché データベースはさまざまな機能を提供し、論理レベルと物理レベル両方のジャーナリングなど、グローバル内に格納されたデータの信頼性を確かなものにします。グローバル内に格納されるデータは、データベースのバックアップ操作が実行されるときにバックアップされます。

  • 分散型 — Caché により、グローバル内に格納されたデータの物理位置を制御することができます。グローバルの格納に使用する物理データベースを定義し、複数のデータベースにグローバルの一部を配布できます。Caché 分散型データベース機能を使用することで、データベース・ネットワークおよびアプリケーション・サーバ・システム間でグローバルを共有することができます。また、データ・シャドウイング・テクノロジにより、システムのグローバル内に格納されたデータを、他のシステムに自動的に複製することができます。

  • 並行処理 — グローバルは、複数プロセス間の同時アクセスをサポートします。個別ノード (配列要素) 内の値の設定と取得は常にアトミックです。信頼性のある同時アクセスを保証するためのロックは必要ありません。また、Caché は強力なロック操作をサポートしており、複数のノードなど、より複雑な状況で並行処理を行うために使用できます。オブジェクトや SQL アクセス使用の際、この並行処理は自動的に実行されます。

  • トランザクション — Caché はトランザクションの境界を指定するコマンドを提供しているので、これを使用するとトランザクションの開始、実行、ロールバックなどが可能です。ロールバックの際、トランザクション内でのグローバルの変更をすべて取り消し、データベースのコンテンツをトランザクション以前の状態にリストアします。Caché のさまざまなロック操作をトランザクションと併用することで、グローバルを使用して従来の ACID トランザクションを実行できます (ACID トランザクションは、アトミック性、一貫性、分離性、持続性を提供します)。オブジェクトや SQL アクセス使用の際、トランザクションは自動的に処理されます。

Note:

このドキュメントで説明するグローバルを、別のタイプの Caché 変数配列であるプロセス・プライベート・グローバルと混同しないようにしてください。プロセス・プライベート・グローバルは永続的ではありません。これを作成したプロセスの間のみ維持されます。プロセス・プライベート・グローバルは並行でもありません。これを作成したプロセスからのみアクセスできます。複数文字の名前の接頭語、^|| または ^|"^"| により、プロセス・プライベート・グローバルはグローバルと簡単に区別できます。

グローバルの容易性とパフォーマンスは、簡単な例を取り上げるとわかります。以下のプログラムは、10,000 個のノードの配列を生成 (既存ノードは先に削除) し、データベースに保存します。グローバルのパフォーマンスを実感するために試してみてください。

—永続配列の生成—
永続配列の生成
 Set start = $ZH  // get current time

 Kill ^Test.Global
 For i = 1:1:10000 {
     Set ^Test.Global(i) = i
 }

 Set elap = $ZH - start  // get elapsed time
 Write "Time (seconds): ",elap

配列内の値を繰り返し処理して読み取るまでに、どのくらいの時間がかかるのか見てください (まず上記例を実行して、配列を構築してください)。

—永続配列の読み取り—
永続配列の読み取り
 Set start = $ZH  // get current time
 Set total = 0
 Set count = 0

 // get key and value for first node
 Set i = $Order(^Test.Global(""),1,data)

 While (i '= "") {
     Set count = count + 1
     Set total = total + data

    // get key and value for next node
    Set i = $Order(^Test.Global(i),1,data)
 }

 Set elap = $ZH - start  // get elapsed time

 Write "Nodes:          ",count,!
 Write "Total:          ",total,!
 Write "Time (seconds): ",elap,!

アプリケーションの使用法

Caché アプリケーションでは、さまざまな方法でグローバルを使用します。以下はその例です。

  • オブジェクト、および SQL エンジンに共有される基本ストレージ・メカニズムとしての使用。

  • オブジェクトおよび SQL データに対するビットマップ・インデックスなど、多様なインデックスを提供するメカニズムとしての使用。

  • プロセス・メモリに収まらない可能性のある操作を実行するためのワーク・スペースとしての使用。例えば、用途に合った既存のインデックスがない場合、SQL エンジンはデータをソートするために一時的なグローバルを使用します。

  • オブジェクトおよび SQL アクセスという点で、表現が困難もしくは非効率的な永続オブジェクトまたは SQL テーブルでの特別なオペレーションを実行するため。例えば、メソッド (あるいはストアド・プロシージャや Web メソッド) を指定して、テーブルの保持データについて特別なデータ分析を行うことが可能です。メソッドを使用することで、そのような操作は完全にカプセル化され、呼び出し側は単にメソッドを呼び出すだけで済みます。

  • アプリケーションに特化したカスタマイズされたストレージ構造を実装するため。リレーショナル形式で表現することが難しいデータの保存を必要とするアプリケーションが数多く存在します。グローバルでカスタム構造を指定し、外部クライアントがその構造をオブジェクト・メソッド経由で利用できるようにします。

  • Caché システムで使用される、構成データ、クラス定義、エラー・メッセージ、実行可能なコードなど、特別な目的をもった多様なデータ構造のため。

グローバルは、リレーショナル・モデルの範囲に限定されません。特定のアプリケーションを最大限に利用するカスタマイズされた構造を自由に開発できます。多くのアプリケーションでグローバルを賢明に使用することにより、リレーショナル・アプリケーション開発者達が待ち望んだパフォーマンスを提供することができます。

アプリケーションでグローバルを直接使用するかどうかにかかわらず、その動作を理解しておくと役に立ちます。グローバルとその性能を理解することは、アプリケーションの最適な配置構成を決定するうえで役立つのはもとより、さらに効率的なアプリケーションを設計する際にも役立ちます。

FeedbackOpens in a new tab