異なるデータベースに分散されているデータをクエリする場合は、AnalyticDB for PostgreSQLのクロスデータベースクエリ機能を使用して、データアクセス効率を向上させることができます。
概要
データベースは、PostgreSQLの高レベルユニットです。 インスタンス内の異なるデータベースは、相互にデータを照会できません。 これにより、ビジネスフィールド間のデータ分離が保証されますが、ビジネスフィールドまたはデータベース全体の関連クエリに不便が生じます。
AnalyticDB for PostgreSQLでは、外部データラッパー (FDW) を使用して、データベース間でデータをクエリできます。 FDWは、AnalyticDB for PostgreSQLの大規模並列処理 (MPP) アーキテクチャに基づいて開発され、計算ノードのパフォーマンス機能を使用して、データベース間クエリのデータアクセス効率を向上させます。
使用上の注意
クロスデータベースクエリ機能は、次のマイナーバージョンでのみサポートされています。
エラスティックストレージモードのAnalyticDB for PostgreSQL V7.0: V7.0.1.x以降。
エラスティックストレージモードのAnalyticDB for PostgreSQL V6.0: V6.3.11.2以降。
サーバーレスモードのAnalyticDB for PostgreSQL: V1.0.6.x以降。
FDW外部テーブルは、SELECTおよびINSERT操作のみをサポートします。 UPDATEおよびDELETE操作はサポートされていません。
エラスティックストレージモードのAnalyticDB for PostgreSQL V7.0のみが、結合プッシュダウンと集約プッシュダウンをサポートしています。
FDW外部テーブルの実行計画を生成できるのは、エラスティックストレージモードのAnalyticDB for PostgreSQL V7.0のOrcaオプティマイザだけです。 エラスティックストレージモードのAnalyticDB for PostgreSQL V6.0およびサーバーレスモードのAnalyticDB for PostgreSQLは、ネイティブオプティマイザを使用してFDW外部テーブルの実行計画を生成します。
手順
AnalyticDB for PostgreSQLインスタンスのdb01データベースとdb02データベース間のデータクエリ機能を有効にするには、次の手順を実行します。 この機能を有効にすると、db01データベースからdb02データベースのテーブルにアクセスできます。
psqlツールを使用してAnalyticDB for PostgreSQLインスタンスに接続します。 詳細については、「クライアント接続」をご参照ください。
db01とdb02という名前の2つのデータベースを作成します。
CREATE DATABASE db01; CREATE DATABASE db02;
greenplum_fdwおよびgp_parallel_retrieve_cursor拡張子をdb01およびdb02データベースにインストールします。 詳細については、「拡張機能のインストール、更新、およびアンインストール」をご参照ください。
db02データベースに切り替え、テストデータを準備します。
\c db02 CREATE SCHEMA s01; CREATE TABLE s01.t1(a int, b int, c text); INSERT INTO s01.t1 VALUES(generate_series(1,10),generate_series(11,20),'t1');
db01データベースに切り替え、サーバーとユーザーマッピングを作成します。
サーバーを作成します。
\c db01 CREATE SERVER db02 FOREIGN DATA WRAPPER greenplum_fdw OPTIONS (host 'localhost', dbname 'db02');
下表に、各パラメーターを説明します。
パラメーター
説明
host
データベース間でデータを照会するために使用されるエンドポイント。 このパラメーターを
localhost
に設定します。dbname
ソースデータベースの名前。 この例では、このパラメーターは
db02
に設定されています。ユーザーマッピングを作成します。 ユーザーマッピングの詳細については、「ユーザーマッピングの作成」をご参照ください。
CREATE USER MAPPING FOR CURRENT_USER SERVER db02 OPTIONS (user 'report', password '******');
下表に、各パラメーターを説明します。
パラメーター
説明
user
インスタンスへの接続に使用されるデータベースアカウントの名前。
データベースアカウントには、db02データベースに対する読み取り権限が必要です。 INSERT操作を実行する場合は、書き込み権限も必要です。 データベースアカウントの作成方法については、「データベースアカウントの作成」をご参照ください。
password
データベースアカウントのパスワードを設定します。
db01データベースのクロスデータベースクエリ機能を有効にします。
次のいずれかの方法を使用して、データベース間クエリ機能を有効にできます。
ソーステーブルの外部テーブルを作成します。
CREATE SCHEMA s01; CREATE FOREIGN TABLE s01.t1(a int, b int) server db02 options(schema_name 's01', table_name 't1');
この方法では、以下のようなメリットとデメリットがあります。
利点: 外部テーブルのカスタムDDL構造を指定できます。 たとえば、db02データベースのt1テーブルにはa、b、cフィールドが含まれていますが、db01データベースにはaとbフィールドしか含まれていません。 この方法を使用すると、外部テーブルを作成するときにフィールドを指定できます。
短所: 各テーブルのDDL構造を知っている必要があります。 一度に複数の外部テーブルをインポートするには、長時間が必要です。
ソースデータベースのスキーマからすべてのテーブルをインポートします。
CREATE SCHEMA s01; IMPORT FOREIGN SCHEMA s01 LIMIT TO (t1, t2, t3) FROM SERVER db02 INTO s01;
この方法では、以下のようなメリットとデメリットがあります。
利点: 短期間で外国のテーブルをインポートできます。 各テーブルのDDL構造を知る必要はありません。
短所: 外部テーブルには、ソースデータベースのテーブルと同じ名前とフィールドが必要です。
詳細については、「IMPORT FOREIGN SCHEMA」をご参照ください。
db01データベースからdb02データベースのデータを照会します。
db01データベースのデータを照会します。
SELECT * FROM s01.t1;
サンプル結果:
a | b | c ----+----+---- 2 | 12 | t1 3 | 13 | t1 4 | 14 | t1 7 | 17 | t1 8 | 18 | t1 1 | 11 | t1 5 | 15 | t1 6 | 16 | t1 9 | 19 | t1 10 | 20 | t1 (10 rows)
関連ドキュメント
AnalyticDB for PostgreSQLは、クロスインスタンスクエリ機能をサポートしています。 詳細については、「クロスインスタンスクエリ」をご参照ください。