外部テーブルの定義
InterSystems SQL では、外部データ・ソースのデータを InterSystems IRIS® データ・プラットフォームに投影する外部テーブルを定義できます。このテーブルを使用すると、InterSystems IRIS に格納されているデータに対するクエリと同様に、このような外部データに対するクエリを実行できます。
外部テーブルは、リンク・テーブルが進化したもので、クエリ処理に関する多くの制限がなくなり、インターシステムズの SQL インタフェースに完全に統合されています。現在リンク・テーブルを使用している場合は、外部テーブルへの移行を検討してください。
外部テーブルは、InterSystems IRIS 2024.1 では試験的機能として利用できます。つまり、実稼働環境ではサポートされません。ただし、この機能は十分にテストされており、お客様に大きな価値をもたらすことができると考えています。
インターシステムズでは、この新機能を実際の環境で使用したお客様からのフィードバックをお待ちしています。ご自分の体験を共有したい場合、または質問がある場合は、Developer Community を参照するか、インターシステムズのサポート窓口 (WRC) までお問い合わせください。
外部テーブルの概要
さまざまな理由により、InterSystems IRIS に直接データをロードすることが不可能であるか、合理的ではない場合があります。例として、データ・ファイルがきわめて大きく、InterSystems IRIS テーブルにロードするストレージ・コストに見合うほど頻繁にはクエリが実行されない状況が挙げられます。外部テーブルは、別のシステムで管理されているデータを投影し、InterSystems IRIS のインスタンスで管理および格納しているデータと同様に、投影したデータにクエリおよびアクセスできるようにする機能です。
外部テーブルの作成
外部テーブルを作成する前に、InterSystems IRIS が外部データ・ソースとどのように対話するかを決定するために外部サーバを定義する必要があります。外部サーバを定義すると、外部ソースのデータを表す外部テーブルを 1 つ以上定義できます。そのためには、外部データ・ソースのフィールドを InterSystems IRIS の列にマッピングするうえで必要な、列の名前とタイプなどの詳細情報を指定します。
手順 1:外部サーバを定義する
外部テーブルを定義するには、外部サーバを定義し、使用する外部データ・ラッパを指定しておく必要があります。このためには、CREATE FOREIGN SERVER コマンドを使用します。
CREATE FOREIGN SERVER コマンドでは、外部データ・ラッパを指定する必要があります。InterSystems IRIS で特定のタイプのデータ・ソースをどのように操作するかを、この外部データ・ラッパで指定します。CREATE FOREIGN SERVER コマンドでは、外部データ・ラッパと、その外部データ・ラッパが必要とするメタデータを指定する必要があります。現在のところ、InterSystems SQL では 2 つの外部データ・ラッパとして CSV と JDBC をサポートしています。CSV 外部データ・ラッパでは、ローカル・ファイル・システムのフォルダへのパスを指定する必要があります。JDBC 外部データ・ラッパでは、外部データベースに接続するための JDBC 接続を指定する必要があります。
外部サーバに定義できる外部テーブルの数に制限はありません。
外部サーバを作成するユーザには、%MANAGE_FOREIGN_SERVER 管理特権が必要です。
以下の例は、CSV 外部データ・ラッパを使用する外部サーバの作成方法を示しています。
CREATE FOREIGN SERVER Sample.TestFile
FOREIGN DATA WRAPPER CSV HOST '\path\to\file'
以下の例は、JDBC 外部データ・ラッパを使用する外部サーバの作成方法を示しています。
CREATE FOREIGN SERVER Sample.PostgresDB
FOREIGN DATA WRAPPER JDBC CONNECTION 'postgresConnection'
手順 2:外部テーブルを定義する
外部サーバを定義すると、CREATE FOREIGN TABLE コマンドを使用して外部テーブルを定義できます。このテーブルの列名は外部ソースのデータと同じ列名にすることができるほか、InterSystems IRIS では別の名前で外部ソースのデータ列を参照することもできます。外部テーブルを作成する構文は、LOAD DATA コマンドに似ています。
CREATE FOREIGN TABLE Sample.AccountTeam (
TeamID BIGINT,
Name VARCHAR(50),
CountryCode VARCHAR(10)
) SERVER Sample.PostgresDB TABLE 'Sample.Teams'
データ定義言語 (DDL) 文を使用して外部テーブルを作成すると、ClassType を "view" として、対応するクラスが作成されます。このクラスは手動で編集しないでください。また、外部テーブルは CREATE FOREIGN TABLE コマンドで定義する必要があります。クラス定義を作成することで外部テーブルを作成することはできません。
外部テーブルを作成するユーザには、テーブルが作成される外部サーバに対する %CREATE_TABLE 管理特権と USE オブジェクト特権が必要です。
外部テーブルのクエリ
外部テーブルのクエリは、ネイティブ・テーブルのクエリとまったく同じです。
SELECT Name, CountryCode FROM Sample.AccountTeam ORDER BY Name
クエリではさらに高度な構文を活用することもできます。
SELECT t.Name, COUNT(m.*)
FROM Sample.AccountManager m JOIN Sample.AccountTeam t
ON m.TeamID = t.TeamID
WHERE t.CountryCode = 'UK' AND m.Salary > 100000
GROUP BY t.Name
InterSystems SQL では、WHERE 節の簡潔な述語が可能な範囲で送信またはプッシュダウンされます。これにより、ネットワーク上で送受信されるデータの量を制限し、リモート・データベースでの最適化を最大限に活用します。ただし、2 つの外部テーブル間での GROUP BY や JOIN のような複雑な節は、外部データの取得を完了した後で InterSystems IRIS によって処理されます。クエリ・プランを表示して、リモート・サーバに送信される文を確認し、元のクエリのどの節がリモート・データベースにプッシュダウンされるかを確認します。
外部データ・ソースでクエリを発行するユーザには %Gateway_Object:USE 特権が必要です。
外部テーブルに対するクエリの発行では、その基盤となる Java ベース・エンジンが使用されます。このエンジンでは、サーバ上に Java 仮想マシン (JVM) をインストールした環境が必要です。セットアップ済みの JVM があり、その JVM に PATH 環境変数でアクセスできれば、初めてクエリを発行したときに、InterSystems IRIS で自動的にその JVM を使用して外部言語サーバが起動します。外部言語サーバをカスタマイズして、特定の JVM を使用するか、リモート・サーバを使用するには、"外部サーバ接続の管理" を参照してください。
パススルー・クエリの発行
THROUGH コマンドを使用すると、SELECT クエリを外部サーバを通じて実行するために外部データ・ソースに直接送信できます。このようなクエリをパススルー・クエリと呼びます。外部データ・ソースは、パススルー・クエリの準備と実行に特化しており、これを使用すると、アクセスしやすいように外部テーブルを作成する前に、外部データ・ソースに保存されたデータをその場で調査できます。
パススルー・クエリを発行するには、JDBC などのパススルー・クエリをサポートする外部データ・ラッパを使用する外部サーバを作成する必要があります。パススルー・クエリを発行する前に外部テーブルを作成する必要はありません。
外部テーブルの削除
外部テーブルを削除するには、DROP FOREIGN TABLE コマンドを使用します。
DROP FOREIGN TABLE Example.MyForeignTable
また、CASCADE オプションを指定して DROP FOREIGN SERVER コマンドを使用すると、外部サーバとそこに定義されているすべての外部テーブルを削除できます。
DROP FOREIGN SERVER Example.PostgresDB CASCADE
DROP FOREIGN SERVER コマンドを発行するユーザには、%MANAGE_FOREIGN_SERVER 管理特権が必要です。