2.16.1 外部表を使用した外部データの検索
外部のオブジェクトストレージまたはファイルストレージに格納されている外部データを表に読み込んで検索できます。この表を外部表といいます。外部表を使用した外部データの検索の概要について,外部データがオブジェクトストレージに格納されている場合と,外部データがファイルストレージに格納されている場合をそれぞれ説明します。
- 外部データがオブジェクトストレージに格納されている場合
-
外部表を使用した外部データの検索の概要を次の図に示します。
図2‒59 外部表を使用した外部データの検索の概要(外部データがオブジェクトストレージに格納されている場合) - [説明]
-
外部データを検索する前に,定義系SQLのCREATE SERVER文で外部サーバを定義し,CREATE FOREIGN TABLE文で外部表を定義しておく必要があります。
上記の図の番号に対応する説明を以下でします。
-
外部表に対して検索系SQL(SELECT文またはCOPY文)を実行します。
-
外部サーバの定義時に指定した認証情報を使用して,HADBサーバは外部のオブジェクトストレージに接続します。
-
外部のオブジェクトストレージに格納されている外部データを読み込んだデータ集合が作成されます。そのデータ集合を基に外部表のデータが作成されます。
-
外部表の検索が実行されて,検索結果を返します。
- メモ
-
次のオブジェクトストレージが対応しています。
-
Amazon S3
-
Amazon S3互換オブジェクトストレージ
-
-
- 外部データがファイルストレージに格納されている場合
-
外部表を使用した外部データの検索の概要を次の図に示します。
図2‒60 外部表を使用した外部データの検索の概要(外部データがファイルストレージに格納されている場合) - [説明]
-
外部データを検索する前に,CREATE FOREIGN TABLE文で外部表を定義しておく必要があります。
上記の図の番号に対応する説明を以下でします。
-
外部表に対して検索系SQL(SELECT文またはCOPY文)を実行します。
-
外部のファイルストレージに格納されている外部データを読み込んだデータ集合が作成されます。そのデータ集合を基に外部表のデータが作成されます。
-
外部表の検索が実行されて,検索結果を返します。
なお,ファイルストレージにはローカルファイルシステムだけでなく,NFSのようなリモートファイルシステムも使用できます。NFSを使用する場合,次のことに注意してください。
-
複数のHADBサーバが並列にアクセスすると,NFSサーバのリソースが不足し,I/O性能が低下するおそれがあります。NFSサーバのリソースの上限を確認してください。
-
NFSクライアントのキャッシュの状態によって,NFSクライアント間でデータの同期に時間が掛かることがあります。これによって,HADBサーバが参照した外部データが不足する,HADBサーバの出力した外部データが別のシステムから読み込めないなどのデータの不整合が発生するおそれがあります。これを防ぐために,NFSのキャッシュ制御パラメータを適切に調整してください。
-
上記の図中に出てくる用語について説明します。
-
外部サーバ
外部サーバとは,物理的な実体があるサーバではなく,外部データを管理するサーバに名称を付けて概念化したものです。CREATE SERVER文で外部サーバを定義する際,外部サーバの名称や,HADBサーバが外部データを格納しているオブジェクトストレージに接続する際に使用する認証情報などを指定します。
- 重要
-
外部データがオブジェクトストレージに格納されている場合は,外部サーバを定義する必要があります。外部データがファイルストレージに格納されている場合は,外部サーバを定義する必要はありません。
CREATE SERVER文による外部サーバの定義例を次に示します。
(例)
CREATE SERVER "FOREIGNSERVER1" ...1 OPTIONS(ACCESS_KEY '6yTZJwzVjl6nYTjKICop' ...2 ,SECRET_KEY 'Bs6E43CgrwXYyX9jvVJpPgH8rOdTafeuVNrwGJf' ...3 ,ENDPOINT 'https://xxxx-yyz99:1234') ...4[説明]
-
定義する外部サーバの名称(FOREIGNSERVER1)を指定します。
-
外部のオブジェクトストレージに接続する際の認証で使用するアクセスキーを指定します。
-
外部のオブジェクトストレージに接続する際の認証で使用するシークレットキーを指定します。
-
エンドポイントを指定します。
-
外部データファイル
外部データファイルとは,外部データを格納しているファイルのことです。外部データのデータ形式は,PARQUET形式,CSV形式,またはJSON形式のどれかである必要があります。また,Icebergテーブルで管理している外部データファイルも検索できます。
HADBサーバは,外部データアクセス用ライブラリを使用して外部データにアクセスします。
-
外部表
外部表とは,外部データを読み込んで作成される表のことで,CREATE FOREIGN TABLE文で定義します。CREATE FOREIGN TABLE文で外部表を定義する際に,外部表の列の構成やデータ型,外部データのデータ形式などを指定します。
- 重要
-
外部表は参照専用の表で,SQL文によるデータの追加,更新,および削除はできません。
CREATE FOREIGN TABLE文による外部表の定義例を次に示します。
-
外部データがオブジェクトストレージに格納されている場合
CREATE FOREIGN TABLE "FT1" ("C1" INTEGER,"C2" INTEGER) ...1 SERVER "FOREIGNSERVER1" ...2 OPTIONS ( FORMAT PARQUET ...3 ,LOCATION 's3://data/' ...4 )[説明]
-
定義する外部表の表名,および外部表の列の構成とデータ型を指定します。
-
外部表が使用する外部サーバの名称を指定します。
外部表の検索時,HADBサーバは外部データを格納しているオブジェクトストレージに接続します。その際,ここで指定した外部サーバ(FOREIGNSERVER1)の定義時に指定した認証情報を使用します。
-
外部データのデータ形式を指定します。外部データがPARQUET形式の場合は,PARQUETを指定します。
-
外部データの検索対象ディレクトリのパスを指定します。
指定したディレクトリ下(サブディレクトリも含む)にある外部データファイル中の外部データが,外部表の検索時に外部表に読み込まれます。この例の場合,s3://data/ディレクトリ下(サブディレクトリ下も含む)にある外部データファイル中の外部データが外部表に読み込まれます。
-
-
外部データがファイルストレージに格納されている場合
CREATE FOREIGN TABLE "FT1" ("C1" INTEGER,"C2" INTEGER) ...1 OPTIONS ( FORMAT PARQUET ...2 ,LOCATION 'file:///data/ftbl/T1/' ...3 )[説明]
-
定義する外部表の表名,および外部表の列の構成とデータ型を指定します。
-
外部データのデータ形式を指定します。外部データがPARQUET形式の場合は,PARQUETを指定します。
-
外部データの検索対象ディレクトリのパスを指定します。
指定したディレクトリ下(サブディレクトリも含む)にある外部データファイル中の外部データが,外部表の検索時に外部表に読み込まれます。この例の場合,/data/ftbl/T1/ディレクトリ下(サブディレクトリ下も含む)にある外部データファイル中の外部データが外部表に読み込まれます。
-
- 外部表と実表の主な違い
-
-
外部表のデータはSQL文やコマンドで更新できません。外部表は検索だけ実行できます(検索系SQLだけ実行できます)。
-
HADBサーバは外部データの管理を行いません。そのため,外部データを格納するデータ用DBエリアを作成する必要はありません。
-
外部表の検索時に,外部データが外部表に読み込まれるため,外部表へのadbimportコマンドによるデータインポートを実行する必要はありません。adbimportコマンドによるデータインポートを実行しないため,チャンクの運用を意識する必要もありません。
-
外部表にはインデクスを定義できません。
-
ALTER TABLE文で外部表の定義は変更できません。
-
- 外部表を定義するメリット,デメリット
-
外部のオブジェクトストレージまたはファイルストレージに格納されているPARQUET形式,CSV形式,またはJSON形式の外部データを外部表に読み込んで検索することができます。また,データ用DBエリアの作成や,外部データのデータインポートが不要になるため,実表に比べて運用が簡単になります。ただし,外部表の検索性能は,実表の検索性能に比べて低くなります。
- 外部表の検索
-
実表と同様にSELECT文で外部表を検索できます。ただし,外部表にはインデクスを定義できません。そのため,外部表に読み込む外部データが非常に多い場合,検索性能の低下要因になります。この場合,外部表の定義時にパーティションキー列を定義すると,外部表に読み込む外部データを絞り込むことができます。
また,外部表の検索時にパーティションキー列を指定すると,外部表に読み込む外部データをさらに絞り込むことができます。パーティションキー列については,マニュアルHADB SQLリファレンスの定義系SQLのCREATE FOREIGN TABLE(外部表の定義)を参照してください。
- メモ
-
-
外部データの格納場所がオブジェクトストレージまたはファイルストレージのどちらであっても,SELECT文を使用した外部表の検索方法は同じになります。
-
外部データの格納場所がオブジェクトストレージまたはファイルストレージのどちらであっても,検索できる外部データのデータ形式(PARQUET形式,CSV形式,またはJSON形式)は同じになります。また,Icebergテーブルで管理している外部データも検索できます。
-
- 外部表と実表を結合した検索
-
外部表と実表,外部表とビュー表を結合した検索もできます。外部表(LOGS)と実表(EMPLOYEE)を結合した検索例を次に示します。
SELECT "LOGS"."EVENTNAME","EMPLOYEE"."USERNAME","EMPLOYEE"."DEPARTMENT" FROM "LOGS" INNER JOIN "EMPLOYEE" ON "LOGS"."USERIDENTITY"."USERNAME" = "EMPLOYEE"."USERNAME" WHERE "EMPLOYEE"."USERNAME" = 'Alice' - 外部データに対するアクセス制御
-
外部データは,実表へのアクセスと異なり,HADBユーザによるアクセス制御は行われません。そのため,外部データに対するアクセス制御が必要な場合,オブジェクトストレージまたはOSの機能を使用して対応する必要があります。
-
外部データがオブジェクトストレージに格納されている場合
-
外部データへのアクセス可否は,オブジェクトストレージにアクセスする際の権限に従います。そのため,オブジェクトストレージにAmazon S3またはAmazon S3互換オブジェクトストレージを使用する場合,S3プロトコルを使用して読み込みまたは書き込みできる環境を構築する必要があります。
-
複数のサーバマシンを使用する場合,アクセスできる外部データの範囲を同じにしたいときは,オブジェクトストレージにアクセスする際の権限を全サーバマシンで統一してください。アクセスできる外部データの範囲を変えたいときは,オブジェクトストレージにアクセスする際の権限をサーバマシンごとに変えてください。
-
-
外部データがファイルストレージに格納されている場合
-
外部データへのアクセス可否は,OSユーザが持っている権限に従います。HADBサーバが外部データにアクセスする際,OSユーザとして登録されているHADB管理者が持っている権限を使用します。そのため,HADB管理者が外部データに対して読み込みまたは書き込みできる環境を構築する必要があります。
-
複数のサーバマシンを使用する場合,HADB管理者のUIDおよびGIDを使ってアクセスできる外部データの範囲を同じにしたいときは,全サーバマシンでHADB管理者のUIDおよびGIDを同じ値にしてください。アクセスできる外部データの範囲を変えたいときは,HADB管理者のUIDおよびGIDをサーバマシンごとに別の値にしてください。
-
-
- 留意事項
-
外部表を使用する場合,サーバ定義のadb_sql_exe_max_rthd_numオペランドに指定した数の処理リアルスレッド以外に,外部表専用のリアルスレッドが1つのコネクションに対して複数個作成されます。また,そのリアルスレッドは,複数のコネクションでも共有して利用されます。サーバ定義のadb_sql_exe_max_rthd_numオペランドに指定した数を超えたリアルスレッドが動作するため,外部表を使用する場合はCPU負荷が高くなります。
- メモ
-
外部表の運用については,「11.3 外部表の運用」を参照してください。