PostgreSQL 連携クエリを実行する
データ アナリストは、データをコピーまたは移動することなく、PostgreSQL に存在するリレーショナル データを BigQuery から直接リアルタイムでクエリできます。
BigQuery PostgreSQL 連携では、BigQuery Connection API を使用して PostgreSQL データベース エンジンに接続します。その後、EXTERNAL_QUERY 関数を使用して SQL クエリを PostgreSQL に直接送信して実行すると、結果が直接ストリーミングされます。
制限事項
PostgreSQL 連携クエリには、次の制限があります。
EXTERNAL_QUERY関数を使用して実行できるのは、読み取り専用クエリのみです。データ定義言語(DDL)ステートメントとデータ操作言語(DML)ステートメントはサポートされていません。- 連携には
EXTERNAL_QUERY関数を介してのみアクセスできます。PostgreSQL テーブルに直接マッピングされる BigQuery 外部テーブルまたは永続データセットの作成はサポートされていません。 - 連携クエリのレイテンシは、PostgreSQL で直接クエリを実行する場合よりも大幅に長くなる可能性があります。
- 基盤となる接続サービスが、非アクティブな接続を休止状態にする可能性があります。非アクティブな期間の後に PostgreSQL 接続を使用する最初のクエリは、コネクタの初期化中に実行に 1 分以上かかることがあります。
- DNS ピアリングはサポートされていません。VPC ネットワーク内の IP アドレスまたは完全に解決可能なホスト名を使用して接続する必要があります。
- PostgreSQL SQL クエリでは、関数の結果または式を含む列(
SELECT COUNT(*) AS total_countなど)に明示的な列エイリアスを指定する必要があります。エイリアスが設定されていない式では、BigQuery テーブル スキーマ定義で無効な特殊文字を含む列名が生成されます。 - クエリ プロジェクトでの Compute Engine API の使用が VPC Service Controls によって制限されている場合、接続でネットワーク アタッチメントが使用されていると、連携クエリは失敗します。適切な VPC Service Controls の上り(内向き)ルールと下り(外向き)ルールが構成されていることを確認します。
PostgreSQL では、追加の SQL プッシュダウンはサポートされていません。外部の BigQuery クエリのフィルタと集計は、
EXTERNAL_QUERY関数内の内部クエリにプッシュダウンされません。ネットワーク経由で転送される行と列を制限するには、内部の PostgreSQL SQL ステートメント内で述語と列のプロジェクションを直接指定する必要があります。PostgreSQL データベースのユーザー名とパスワードによる認証のみがサポートされています。サードパーティの ID プロバイダ、Kerberos、クラウド プロバイダの IAM 認証はサポートされていません。
クエリで 16 ビット整数列(
int2、smallint、smallserial)または単精度浮動小数点数列(float4、real)が選択されている場合、CREATE TABLE ... AS SELECT(CTAS)ステートメントはUnsupported type INT32またはUnsupported type FLOATエラーで失敗します。クエリ結果を新しい BigQuery テーブルに保存するには、クエリで整数列をINT64に、浮動小数点数列をFLOAT64に明示的にキャストします。CREATE TABLE mydataset.mytable AS SELECT CAST(small_col AS INT64) AS small_col, CAST(real_col AS FLOAT64) AS real_col, ... FROM EXTERNAL_QUERY(...);
INSERT INTO <table> SELECT ...を使用して既存のテーブルに挿入すると、BigQuery がINT32値とFLOAT値を自動的に拡張してターゲット テーブルのINT64列とFLOAT64列に一致させるため、手動キャストなしで成功します。time [ without time zone ]とtime with time zone(timetz)はどちらも、1 秒未満(マイクロ秒)の小数値を秒単位に切り捨てます。マイクロ秒の精度が必要な場合は、EXTERNAL_QUERYステートメントで列をtextまたはvarcharにフォーマットまたはキャストします。すべての PostgreSQL
numeric列とdecimal列はBIGNUMERIC(76, 38)にマッピングされます。スケールが 38 を超える列は小数点以下 38 桁に丸められ、BIGNUMERICの範囲を超える値(38 桁を超える整数)は範囲外エラーで失敗します。また、特別な値NaN、Infinity、-Infinityはサポートされておらず、実行時に失敗します。整数部分が大きい数値、小数部分の精度が高い数値、または特殊な値をクエリするには、EXTERNAL_QUERYステートメントで列をtextにキャストします。固定長の
character(n)/char(n)(bpchar)値は、BigQuerySTRINGにマッピングされるときに、長さ n までの末尾のスペースを保持します。1582 年 10 月 15 日より前の日付とタイムスタンプは、歴史的なグレゴリオ暦の移行により、10 日間のカレンダー シフトの対象となります。正確な日付を保持するには、
EXTERNAL_QUERYステートメントで過去の日付をtextにキャストします。
サポートされている PostgreSQL の環境とバージョン
クエリ連携では、次のデプロイ環境で PostgreSQL データベースがサポートされています。
- パブリック IP アドレスまたはネットワーク アタッチメント(Cloud VPN または Cloud Interconnect 経由)を介してアクセス可能な、クラウドホスト型またはオンプレミスの PostgreSQL データベース
- Compute Engine または他のインフラストラクチャ上のセルフホスト型 PostgreSQL インスタンス
- PostgreSQL 16(推奨)と PostgreSQL 15
始める前に
BigQuery 管理者が PostgreSQL 接続を作成して、共有していることを確認します。
必要なロール
PostgreSQL をクエリするのに必要な権限を取得するには、プロジェクトに対する BigQuery 接続ユーザー(roles/bigquery.connectionUser)の IAM ロールを付与するよう管理者に依頼してください。ロールの付与については、プロジェクト、フォルダ、組織に対するアクセス権の管理をご覧ください。
必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。
データのクエリ
GoogleSQL クエリから PostgreSQL に連携クエリを送信するには、EXTERNAL_QUERY 関数を使用します。
次の例は、mydataset.customers という名前の BigQuery の顧客レコードと PostgreSQL のトランザクション販売注文を結合する連携クエリです。
SELECT c.customer_id, c.name, fo.first_order_date FROM mydataset.customers AS c LEFT OUTER JOIN EXTERNAL_QUERY( 'projects/my-project/locations/us-central1/connections/postgres_prod_conn', '''SELECT customer_id, MIN(order_date) AS first_order_date FROM orders GROUP BY customer_id''') AS fo ON fo.customer_id = c.customer_id GROUP BY c.customer_id, c.name, fo.first_order_date;
PostgreSQL テーブル スキーマを表示する
EXTERNAL_QUERY を使用して PostgreSQL の information_schema テーブルをクエリし、データベース メタデータを取得できます。
スキーマ内のすべてのテーブルを一覧表示する
SELECT * FROM EXTERNAL_QUERY( 'projects/PROJECT_ID/locations/LOCATION/connections/CONNECTION_ID', '''SELECT table_schema, table_name, table_type FROM information_schema.tables WHERE table_schema = 'SCHEMA_NAME' ORDER BY table_name''');
テーブルの列とデータ型を表示する
SELECT * FROM EXTERNAL_QUERY( 'projects/PROJECT_ID/locations/LOCATION/connections/CONNECTION_ID', '''SELECT column_name, data_type, is_nullable FROM information_schema.columns WHERE table_schema = 'SCHEMA_NAME' AND table_name = 'TABLE_NAME' ORDER BY ordinal_position''');
データ型マッピング
連携クエリを実行すると、BigQuery は次の表に従って PostgreSQL のデータを GoogleSQL データ型に変換します。
| PostgreSQL のデータ型 | BigQuery のデータ型 |
|---|---|
| ブール型 | |
bool、boolean |
BOOL |
| 数値型 | |
int2、smallint、smallserial |
INT64(インタラクティブ クエリ。CREATE TABLE ... AS SELECT の制限事項をご覧ください) |
int4、integer、serial |
INT64 |
int8、bigint、bigserial |
INT64 |
numeric、decimal |
BIGNUMERIC(76, 38) |
float4、real |
FLOAT64(インタラクティブ クエリ。CREATE TABLE ... AS SELECT の制限事項をご覧ください) |
float8、double precision |
FLOAT64 |
| 日時型 | |
date |
DATE |
timestamp [ without time zone ] |
DATETIME |
timestamp with time zone、timestamptz |
TIMESTAMP |
time [ without time zone ] |
TIME |
time with time zone、timetz |
TIME |
| 文字とテキストのタイプ | |
character(n)、char(n)、bpchar |
STRING |
character varying(n)、varchar(n) |
STRING |
text |
STRING |
料金
連携クエリの実行にかかる費用は、次の 3 つの要因に基づきます。
- PostgreSQL でクエリを実行する際のコンピューティング費用(PostgreSQL データベース プロバイダまたはホスティング環境によって課金されます)
- PostgreSQL から BigQuery にクエリ結果を転送する際の帯域幅費用(データベース ホスティング プロバイダからの下り(外向き)ネットワーク料金)
- BigQuery でクエリを実行するコンピューティング費用
PostgreSQL のコンピューティング費用と下り(外向き)費用は、Google ではなく、PostgreSQL プロバイダまたはインフラストラクチャ ホストから直接請求されます。帯域幅コストを抑えるため、クエリは、最終結果の計算に不要な列と行をすべて除外するように、EXTERNAL_QUERY ステートメントに記述することをおすすめします。
BigQuery で連携クエリを実行しても追加料金は発生しません。BigQuery の料金の詳細については、料金をご覧ください。
接続で Google Cloud ネットワーキング コンポーネントを使用している場合は、次の料金も適用されることがあります。
次のステップ
- PostgreSQL への接続方法を学習する。
- 連携クエリの詳細を確認する。
- 接続の管理について確認する。
- AlloyDB 連携クエリについて学習する。
- Cloud SQL 連携クエリについて学習する。