Skip to main content

フェデレーション・テーブル

Important:

フェデレーション・テーブルは、InterSystems IRIS 2023.2 で試験的機能として用意されています。つまり、実稼働環境ではサポートされません。ただし、この機能は十分にテストされており、お客様に大きな価値をもたらすことができると考えています。

インターシステムズでは、この新機能を実際の環境で使用したお客様からのフィードバックをお待ちしています。ご自分の体験を共有したい場合、または質問がある場合は、Developer Community を参照するか、インターシステムズのサポート窓口 (WRC) までお問い合わせください。

フェデレーション・テーブルは、同じまたは同様のスキーマをホストしている InterSystems IRIS® データ・プラットフォームの複数の異なるインスタンスに存在するデータへのクエリ・アクセスを提供します。シャード・テーブルとは異なり、フェデレーション・テーブルは読み取り専用であり、シャード・キーに基づいて複数のソースにわたってデータを管理したり、分散することはありません。フェデレーション・テーブルのソース・テーブルは、そのデータを物理的に格納し、個別のインスタンスまたはネームスペースに存在し、ホスト・インスタンスによって排他的に管理されます。このため、フェデレーション・テーブルは読み取り専用です。フェデレーション・テーブルは、マルチテナント環境など、同じアプリケーションやスキーマのさまざまな導入にわたって分析やクエリが必要なユース・ケースにソリューションを提供します。

フェデレーション・テーブル作成の要件

複数のソース・テーブルを 1 つのフェデレーション・テーブルとして接続するには、まず、該当するソース・データを含むインスタンスすべてにわたるシャード・クラスタを構成する必要があります。シャード・クラスタの構成の詳細は、"シャード・クラスタの導入" を参照してください。シャーディングが初めての場合は、"シャーディングによるデータ量に応じた水平方向の拡張" で、用語や概念を理解しておくと役立ちます。

1 つ以上のソース・テーブルを含むネームスペース (ソース・ネームスペースと呼ばれる) ごとに、クラスタ・ネームスペースを作成する必要があります。この要件は、各ネームスペースが個別のインスタンスに存在する場合と、複数のソース・ネームスペースが同一のインスタンスに存在する場合の両方に適用されます。後者の場合、同一のインスタンス上に複数のクラスタ・ネームスペースを構成して、各ソース・ネームスペースが対応するクラスタ・ネームスペースを持つようにする必要があります。

以下の図は、フェデレーション・テーブル、ソース・テーブル、クラスタ・ネームスペース、およびソース・ネームスペースのリレーションシップを示しています。

シャード・クラスタの 3 つのインスタンスで、ソース・テーブルが、クラスタ・ネームスペースを介してアクセス可能なフェデレーション・テーブルに投影されています

フェデレーション・テーブルの作成

シャード・クラスタを構成すると、フェデレーション・テーブルの作成は、フェデレーション・テーブルの定義と、フェデレーション・テーブルへのソース・テーブルの接続の 2 つの手順で構成されます。

フェデレーション・テーブルの定義

シャード・クラスタのマスタ・ネームスペースから、$SYSTEM.Sharding.CreateFederatedTable() を使用してフェデレーション・テーブルを作成できます。このメソッドの使用法の詳細は、クラス・リファレンスを参照してください。

CreateFederatedTable() によって、フェデレーション・テーブルを表し、ソース・テーブルの列をフェデレーション・テーブルに投影する方法を定義したフェデレーション・テーブル定義が、クラスタ・ネームスペースに登録されます。API 呼び出しの一部として、ソース・テーブルの列がフェデレーション・テーブルから除外されたり、定数値を持つダミー列が追加される場合があります (ソース・ネームスペースを識別するためなど)。またこのメソッドは、指定されたソース・ネームスペースからの最初のソース・テーブルをアタッチします。このソース・テーブルは、同じインスタンス上に格納されます。ソース・ネームスペースが、そのテーブルの投影先のフェデレーション・テーブルの存在によって影響を受けることはありません。

フェデレーション・テーブル定義に関して、以下の点に留意してください。

  • ソース・テーブル内のプライベート・プロパティは、CreateFederatedTable() の引数として明示的にリストされない限り、フェデレーション・テーブルに投影されません。

  • ソース・フィールドのデータ型は、フェデレーション・テーブル内の対応するフィールドのデータ型と同じである必要はありません。暗黙的なデータ型変換は、UNION 節で使用されるものと同じで、VARCHAR、DOUBLE、NUMERIC、BIGINT、INTEGER、SMALLINT、TINYINT のように、優先順位の最も高いデータ型を返します。

  • SqlRowIdPrivate クラス・キーワードはソース・テーブルによって指定され、ID はソース・テーブルからの名前で投影されます。このキーワードが定義されている場合、RowID はフェデレーション・テーブルに投影されません。DDL を介して作成されたテーブルでは、既定で SqlPrivateRowId が指定されることに注意してください。

新規作成されたフェデレーション・テーブルは、シャード・クラスタ内の任意のクラスタ・ネームスペースからすぐにアクセス可能になります。

この時点で、新規作成されたフェデレーション・テーブルは、CreateFederatedTable() の呼び出しで参照されたソース・ネームスペース内のソース・テーブルからのデータのみを投影します。ソース・テーブルのデータを他のソース・ネームスペースに追加する方法については、以下の "フェデレーション・テーブルへのソース・テーブルの接続" を参照してください。

以下の例では、ターミナルから CreateFederatedTable() を呼び出して、IRISCLUSTER ネームスペース (クラスタ・ネームスペースの既定の名前) にフェデレーション・テーブル Hospital.Employees を作成します。このフェデレーション・テーブルでは、USER ネームスペースの Employees.Doctors を最初のソース・テーブルとして使用します。このフェデレーション・テーブルの列は、ソース・テーブルの列と同一です。

do $SYSTEM.Sharding.CreateFederatedTable(,"Hospital.Employees", "USER", "Employees.Doctors")

以下の例では、IRISCLUSTER クラスタ・ネームスペースにフェデレーション・テーブル Hospital.DiagnosisLog を作成します。このフェデレーション・テーブルでは、HOSPITAL ネームスペースの Hospital.Patient を最初のソース・テーブルとして使用し、そのソース・テーブルから Diagnosis 列と DateAdmitted 列を投影します。ここでは、DateAdmitted 列が AdmissionDate としてフェデレーション・テーブルに投影されます。この例の結果として得られるフェデレーション・テーブルには、2 つの列のみが含まれます。

do $SYSTEM.Sharding.CreateFederatedTable("IRISCLUSTER","Hospital.DiagnosisLog", "HOSPITAL", "Hospital.Patient", $lb($lb("Diagnosis"), $lb("DateAdmitted","AdmissionDate")))

フェデレーション・テーブルへのソース・テーブルの接続

フェデレーション・テーブルを作成したら、これに他のソース・ネームスペースのソース・テーブルを接続します。そのためには、各ソース・ネームスペースで $SYSTEM.Sharding.ConnectFederatedTable() メソッドを使用します。このメソッドの詳細は、クラス・リファレンスを参照してください。

ソース・テーブルをフェデレーション・テーブルに接続すると、TUNE TABLE で収集されていたテーブル統計がそのフェデレーション・テーブルに報告されます。クエリ・パフォーマンスを最適化するために、ソース・テーブルをフェデレーション・テーブルに接続する前に、そのソース・テーブルで TUNE TABLE を実行して、テーブル統計を最大限正確なものにする必要があります。ソース・テーブルを再チューニングする必要があり、更新された統計をフェデレーション・テーブルに伝播する場合は、ソース・テーブルをチューニングしてから、ConnectFederatedTable()Force 引数を 1 に指定して、これをフェデレーション・テーブルに再接続します。

ソース・テーブルが変更されたり、削除された場合、フェデレーション・テーブル定義は自動的に更新されません。これは、フェデレーション・テーブルがソース・ネームスペースを読み取り専用として扱い、そのネームスペース内のイベントはフェデレーション・テーブルをトリガできないためです。ソース・テーブルが変更された場合、変更されたソース・ネームスペースに対応するクラスタ・ネームスペースで ConnectFederatedTable() を呼び出し、ConnectFederatedTable()Force 引数を 1 に指定して、変更を指定する必要があります。例えば、ソース・テーブル内の列名を変更した場合、フェデレーション・テーブルに投影される列名を再指定する必要があります。フェデレーション・テーブルに投影する必要のないソース・テーブルへの列の追加など、互換性のある変更の場合、このステップは不要です。

複数の異なるソース・ネームスペース間でソース・テーブルの構造が同じであれば、ConnectFederatedTable() の呼び出しは簡単にスクリプト化できます。%SYSTEM.ShardWorkMgr.Broadcast() インスタンス・メソッドを使用して、各クラスタ・ネームスペースで 1 回呼び出しを実行するだけです。詳細は、"" を参照してください。

以下の例では、ConnectFederatedTable() を使用して、USER ネームスペース内の Employees.Nurses ソース・テーブルを IRISCLUSTER ネームスペース内の Hospital.Employees フェデレーション・テーブルに接続します。

do $SYSTEM.Sharding.CreateFederatedTable("IRISCLUSTER","Hospital.Employees","USER","Employees.Nurses")

以下の例では、%SYSTEM.ShardWorkMgr.Broadcast() インスタンス・メソッドを使用して、HOSPITAL ネームスペース内の Employees.Nurses というソース・テーブルを、新たに作成した、同じく Employees.Nurses というフェデレーション・テーブルに接続します。この手法では、インスタンス間に同じ引数がブロードキャストされるため、各インスタンスにまったく同じ名前のソース・テーブルおよびソース・ネームスペースが必要です。ConnectFederatedTable() のクラスタ・ネームスペースの引数は、空白のままにしておく必要があります。

zn "IRISCLUSTER"
set status=$SYSTEM.Sharding.CreateFederatedTable(,"Employees.Nurses","HOSPITAL","Employees.Nurses")
set shardManager=$SYSTEM.ShardWorkMgr.%New()
set status=shardManager.Broadcast("DS","##class(%SYSTEM.Sharding).ConnectFederatedTable",,"Employees.Nurses","HOSPITAL","Employees.Nurses")

フェデレーション・テーブルに対するクエリ

フェデレーション・テーブルに対するクエリは、標準テーブルに対するクエリと透過的に同様です。フェデレーション・テーブルに対するクエリは、ダイナミック SQL埋め込み SQL、または JDBCODBC といったデータベース・ドライバを使用して実行できます。

フェデレーション・テーブルの削除または切断

シャード・クラスタからフェデレーション・テーブルを削除するには、$SYSTEM.Sharding.DropFederatedTable() を使用します。このメソッドは、任意のインスタンスのクラスタ・ネームスペースから呼び出され、すべてのクラスタ・ネームスペースからフェデレーション・テーブル定義を削除します。フェデレーション・テーブルはもう存在しないので、これ以降のフェデレーション・テーブルへのクエリの試行は失敗します。フェデレーション・テーブルの削除によって、ソース・テーブルやそのデータが影響を受けることはありません。

フェデレーション・テーブルから 1 つのソース・テーブルを削除するには、切断するソース・テーブルを含むソース・ネームスペースに対応するクラスタ・ネームスペースから $SYSTEM.Sharding.DisconnectFederatedTable() を呼び出します。このメソッドは、フェデレーション・テーブルからソース・テーブルを切断します。フェデレーション・テーブルからソース・テーブルを切断すると、そのフェデレーション・テーブルに対するクエリでは、そのソース・テーブルからのデータを返さなくなります。このソース・テーブルは、後で ConnectFederatedTable() を使用して、フェデレーション・テーブルに再接続することができます。

FeedbackOpens in a new tab