The <filename>postgres_fdw</filename> module provides the foreign-data wrapper
<literal>postgres_fdw</literal>, which can be used to access data
stored in external <productname>PostgreSQL</productname> servers.
postgres_fdw
モジュールは、外部のPostgreSQLサーバに格納されたデータをアクセスするために使用する、postgres_fdw
外部データラッパーを提供します。
The functionality provided by this module overlaps substantially
with the functionality of the older <xref linkend="dblink"/> module.
But <filename>postgres_fdw</filename> provides more transparent and
standards-compliant syntax for accessing remote tables, and can give
better performance in many cases.
実質上、本モジュールの提供する機能は以前のdblinkモジュールが提供する機能と重複していますが、postgres_fdw
はリモートのテーブルにアクセスするためにより透過的で標準に準拠した構文を利用できるほか、多くの場合においてより良い性能を得る事ができます。
To prepare for remote access using <filename>postgres_fdw</filename>:
postgres_fdw
を使用したリモートアクセスを準備するには:
Install the <filename>postgres_fdw</filename> extension using <xref
linkend="sql-createextension"/>.
CREATE EXTENSIONを使用してpostgres_fdw
拡張をインストールします。
Create a foreign server object, using <xref linkend="sql-createserver"/>,
to represent each remote database you want to connect to.
Specify connection information, except <literal>user</literal> and
<literal>password</literal>, as options of the server object.
CREATE SERVERを使用して、接続しようとする各リモートデータベースを定義する外部サーバオブジェクトを作成します。
user
およびpassword
を除く接続パラメータを、外部サーバオブジェクトのオプションとして指定します。
Create a user mapping, using <xref linkend="sql-createusermapping"/>, for
each database user you want to allow to access each foreign server.
Specify the remote user name and password to use as
<literal>user</literal> and <literal>password</literal> options of the
user mapping.
CREATE USER MAPPINGを使用して、外部サーバへのアクセスを許可するデータベースユーザごとにユーザマッピングを作成します。
ユーザマッピングのuser
およびpassword
オプションを使用してリモートユーザのためのユーザ名とパスワードを指定します。
Create a foreign table, using <xref linkend="sql-createforeigntable"/> or <xref linkend="sql-importforeignschema"/>, for each remote table you want to access. The columns of the foreign table must match the referenced remote table. You can, however, use table and/or column names different from the remote table's, if you specify the correct remote names as options of the foreign table object. CREATE FOREIGN TABLEもしくはIMPORT FOREIGN SCHEMAを使用して、アクセスしたいリモートテーブルごとに外部テーブルを作成します。 外部テーブルのカラム定義は被参照側のリモートテーブルに一致していなければなりません。 しかしながら、外部テーブルのオプションとして正しいリモートの名前を外部テーブルのオプションに指定すれば、テーブルおよびカラム名はリモートのものと異なった名前を付ける事ができます。
Now you need only <command>SELECT</command> from a foreign table to access
the data stored in its underlying remote table. You can also modify
the remote table using <command>INSERT</command>, <command>UPDATE</command>,
<command>DELETE</command>, <command>COPY</command>, or
<command>TRUNCATE</command>.
(Of course, the remote user you have specified in your user mapping must
have privileges to do these things.)
今のところ、リモートテーブルに格納されているデータにアクセスするには少なくとも外部テーブルに対するSELECT
権限が必要です。
また、INSERT
やUPDATE
、DELETE
、COPY
、TRUNCATE
を使用してリモートテーブルを操作する事もできます。
(もちろん、ユーザマッピングで指定されたリモートユーザは、これらの操作を実行する権限を有している必要があります)
Note that the <literal>ONLY</literal> option specified in
<command>SELECT</command>, <command>UPDATE</command>,
<command>DELETE</command> or <command>TRUNCATE</command>
has no effect when accessing or modifying the remote table.
リモートテーブルをアクセスあるいは変更する際、SELECT
、UPDATE
、DELETE
、TRUNCATE
に対してONLY
オプションを指定しても効果はありません。
Note that <filename>postgres_fdw</filename> currently lacks support for
<command>INSERT</command> statements with an <literal>ON CONFLICT DO
UPDATE</literal> clause. However, the <literal>ON CONFLICT DO NOTHING</literal>
clause is supported, provided a unique index inference specification
is omitted.
Note also that <filename>postgres_fdw</filename> supports row movement
invoked by <command>UPDATE</command> statements executed on partitioned
tables, but it currently does not handle the case where a remote partition
chosen to insert a moved row into is also an <command>UPDATE</command>
target partition that will be updated elsewhere in the same command.
postgres_fdw
は今のところ、ON CONFLICT DO UPDATE
句のあるINSERT
文をサポートしていないことに注意して下さい。
しかし、一意インデックスの推定の指定を省略しているならば、ON CONFLICT DO NOTHING
句はサポートされます。
postgres_fdw
は、パーティションテーブルで実行されたUPDATE
文により引き起こされる行の移動をサポートしますが、移動した行を挿入するよう選択されたリモートパーティションが同じコマンド内で別の場所で更新されるUPDATE
対象のパーティションでもある場合は、今のところ扱わないことにも注意してください。
It is generally recommended that the columns of a foreign table be declared
with exactly the same data types, and collations if applicable, as the
referenced columns of the remote table. Although <filename>postgres_fdw</filename>
is currently rather forgiving about performing data type conversions at
need, surprising semantic anomalies may arise when types or collations do
not match, due to the remote server interpreting query conditions
differently from the local server.
一般的な推奨事項として、可能であれば外部テーブルのカラムを、被参照側のリモートテーブル側のカラムと全く同一のデータ型および照合順序によって定義してください。
postgres_fdw
は必要に応じてデータ型の変換を行いますが、リモートサーバがローカルサーバとは異なる問い合わせ条件の解釈を行うため、データ型や照合順序が一致していないと、時には予期しない意味論的に異常な結果を得る事があるかもしれません。
Note that a foreign table can be declared with fewer columns, or with a different column order, than its underlying remote table has. Matching of columns to the remote table is by name, not position. リモートテーブルより少ないカラム数で、あるいは異なった順序であっても外部テーブルを定義できる事に留意してください。 リモートテーブル側のカラムとの対応付けは、その位置ではなく、名前によって行われます。
A foreign server using the <filename>postgres_fdw</filename> foreign data wrapper
can have the same options that <application>libpq</application> accepts in
connection strings, as described in <xref linkend="libpq-paramkeywords"/>,
except that these options are not allowed or have special handling:
postgres_fdw
外部データラッパーを使用する外部サーバは、以下に記す許されていないものや特別な取り扱いのものを除き、32.1.2に記載されているlibpqが接続文字列としてサポートするものと同一のオプションを使用する事ができます。
<literal>user</literal>, <literal>password</literal> and <literal>sslpassword</literal> (specify these
in a user mapping instead, or use a service file)
《マッチ度[90.131579]》user
、password
およびsslpassword
(これらは代わりにユーザマッピングのオプションの中で指定するか、サービスファイルを使用します)
<literal>client_encoding</literal> (this is automatically set from the local
server encoding)
client_encoding
(これはローカルサーバのエンコーディングが自動的にセットされます)
<literal>application_name</literal> - this may appear in
<emphasis>either or both</emphasis> a connection and
<xref linkend="guc-pgfdw-application-name"/>.
If both are present, <varname>postgres_fdw.application_name</varname>
overrides the connection setting.
Unlike <application>libpq</application>,
<filename>postgres_fdw</filename> allows
<varname>application_name</varname> to include
<quote>escape sequences</quote>.
See <xref linkend="guc-pgfdw-application-name"/> for details.
application_name
-これは接続とpostgres_fdw.application_nameのいずれかまたは両方に現れる可能性があります。
両方が存在する場合、postgres_fdw.application_name
は接続設定を上書きします。
libpqとは異なり、postgres_fdw
はapplication_name
に「エスケープシーケンス」を含めることを許可します。
詳細はpostgres_fdw.application_nameを参照してください。
<literal>fallback_application_name</literal> (always set to
<literal>postgres_fdw</literal>)
fallback_application_name
(自動的にpostgres_fdw
とセットされます)
<literal>sslkey</literal> and <literal>sslcert</literal> - these may
appear in <emphasis>either or both</emphasis> a connection and a user
mapping. If both are present, the user mapping setting overrides the
connection setting.
sslkey
とsslcert
- これは、接続とユーザマッピングのどちらか一方、または両方に現れます。
両方に存在する場合、ユーザマッピングの設定が接続設定に優先します。
Only superusers may create or modify user mappings with the
<literal>sslcert</literal> or <literal>sslkey</literal> settings.
スーパーユーザのみがsslcert
やsslkey
の設定のあるユーザマッピングを作成したり修正したりできます。
Non-superusers may connect to foreign servers using password
authentication or with GSSAPI delegated credentials, so specify the
<literal>password</literal> option for user mappings belonging to
non-superusers where password authentication is required.
非スーパーユーザはパスワード認証またはGSSAPI委任認証情報を使用して外部サーバに接続するため、パスワード認証が必要な非スーパーユーザに属するユーザマッピングにはpassword
オプションを指定します。
A superuser may override this check on a per-user-mapping basis by setting
the user mapping option <literal>password_required 'false'</literal>, e.g.,
ユーザマッピングオプションpassword_required 'false'
を設定することで、スーパーユーザはこのユーザマッピング単位の検査を無効にできます。例えば以下の通りです。
ALTER USER MAPPING FOR some_non_superuser SERVER loopback_nopw OPTIONS (ADD password_required 'false');
To prevent unprivileged users from exploiting the authentication rights of the unix user the postgres server is running as to escalate to superuser rights, only the superuser may set this option on a user mapping. 非特権ユーザが、postgresサーバが動作しているunixユーザの認証権限を悪用して、スーパーユーザ権限へ昇格するのを防ぐため、スーパーユーザのみがユーザマッピングでこのオプションを設定できます。
Care is required to ensure that this does not allow the mapped
user the ability to connect as superuser to the mapped database per
CVE-2007-3278 and CVE-2007-6601. Don't set
<literal>password_required=false</literal>
on the <literal>public</literal> role. Keep in mind that the mapped
user can potentially use any client certificates,
<filename>.pgpass</filename>,
<filename>.pg_service.conf</filename> etc. in the unix home directory of the
system user the postgres server runs as. They can also use any trust
relationship granted by authentication modes like <literal>peer</literal>
or <literal>ident</literal> authentication.
CVE-2007-3278やCVE-2007-6601により、マップされたユーザがマップされたデータベースにスーパーユーザとして接続するのを許可しないことを確実にするよう注意が必要です。
public
ロールではpassword_required=false
を設定しないでください。
postgresサーバが動作しているシステムユーザのunixのホームディレクトリにある、任意のクライアント証明書や.pgpass
、.pg_service.conf
などをマップされたユーザは潜在的には利用可能なことを心に留めておいてください。
peer
やident
認証のような認証モードで付与された信頼関係を使うこともできます。
These options can be used to control the names used in SQL statements sent to the remote <productname>PostgreSQL</productname> server. These options are needed when a foreign table is created with names different from the underlying remote table's names. これらのオプションによりリモートのPostgreSQLサーバに送出されるSQL文で使用される名前を制御する事ができます。 外部テーブルがリモートテーブルとは異なった名前で定義されている場合、これらのオプションは必須です。
schema_name
(string
)This option, which can be specified for a foreign table, gives the schema name to use for the foreign table on the remote server. If this option is omitted, the name of the foreign table's schema is used. 外部テーブルに対して指定できるこのオプションは、リモートサーバ上のリモートテーブルのスキーマ名を与えます。 省略された場合、外部テーブルのスキーマ名が使用されます。 (訳注: to use for the foreign table on... は remote table の間違い。)
table_name
(string
)This option, which can be specified for a foreign table, gives the table name to use for the foreign table on the remote server. If this option is omitted, the foreign table's name is used. 外部テーブルに対して指定できるこのオプションは、リモートサーバ上のリモートテーブル名を与えます。 省略された場合、外部テーブルのテーブル名が使用されます。
column_name
(string
)This option, which can be specified for a column of a foreign table, gives the column name to use for the column on the remote server. If this option is omitted, the column's name is used. 外部テーブルのカラムに対して指定できるこのオプションは、リモートサーバ上のカラム名を与えます。 省略された場合、外部テーブルのカラム名が使用されます。
<filename>postgres_fdw</filename> retrieves remote data by executing queries
against remote servers, so ideally the estimated cost of scanning a
foreign table should be whatever it costs to be done on the remote
server, plus some overhead for communication. The most reliable way to
get such an estimate is to ask the remote server and then add something
for overhead — but for simple queries, it may not be worth the cost
of an additional remote query to get a cost estimate.
So <filename>postgres_fdw</filename> provides the following options to control
how cost estimation is done:
postgres_fdw
はリモートサーバに対するクエリを実行しリモートのデータを受信します。したがって、理想的には外部テーブルをスキャンする推定コストは、それをリモートサーバで実行するコストと通信オーバーヘッドの和となります。
この推定を行うための最も信頼できる方法は、リモートサーバに問い合わせを行い、その結果にオーバーヘッド分を加算する事ですが、小さいクエリではコスト推定を得るための追加的な問い合わせに要するコストに見合わないかもしれません。
そこで、どのようにコスト推定を行うかを制御するため、postgres_fdw
は以下のようなオプションを提供します。
use_remote_estimate
(boolean
)
This option, which can be specified for a foreign table or a foreign
server, controls whether <filename>postgres_fdw</filename> issues remote
<command>EXPLAIN</command> commands to obtain cost estimates.
A setting for a foreign table overrides any setting for its server,
but only for that table.
The default is <literal>false</literal>.
外部テーブルまたは外部サーバに指定できるこのオプションは、コスト推定を得るためにpostgres_fdw
がリモートのEXPLAIN
コマンドを発行するかどうかを制御します。
外部テーブルに対する設定は、関連付けられた外部サーバに対する設定を上書きしますが、その効果は当該外部テーブルに限定されます。
デフォルト値はfalse
です。
fdw_startup_cost
(floating point
)
This option, which can be specified for a foreign server, is a floating
point value that is added to the estimated startup cost of any
foreign-table scan on that server. This represents the additional
overhead of establishing a connection, parsing and planning the query on
the remote side, etc.
The default value is <literal>100</literal>.
外部テーブルまたは外部サーバに指定できるこのオプションは、当該外部サーバに関連付けられた全ての外部テーブルスキャンの推定開始コストに加算される浮動小数点値です。
これは、接続の確立、リモート側でのクエリのパース・最適化など、追加的なオーバーヘッドを表現します。
デフォルト値は100
です。
fdw_tuple_cost
(floating point
)
This option, which can be specified for a foreign server, is a floating
point value that is used as extra cost per-tuple for foreign-table
scans on that server. This represents the additional overhead of
data transfer between servers. You might increase or decrease this
number to reflect higher or lower network delay to the remote server.
The default value is <literal>0.2</literal>.
《マッチ度[88.051948]》外部サーバに指定できるこのオプションは、このサーバでの外部テーブルのスキャンにおいて、各タプル毎に発生する追加的なコストとして使用される浮動小数点値です。
これは、サーバ間のデータ転送における追加的なオーバーヘッドを表現し、リモートサーバへのネットワーク遅延の高低を反映するためにこの数値を増減することができます。
デフォルト値は0.01
です。
《機械翻訳》このオプションは、外部サーバに対して指定でき、そのサーバでの外部テーブルスキャンに対する追加のタプルあたりのコストとして浮動小数点値を使用します。
これは、サーバ間のデータ転送の追加のオーバーヘッドを表します。
この数値を増減して、リモートサーバへのネットワーク遅延を増減できます。
デフォルト値は0.2
です。
When <literal>use_remote_estimate</literal> is true,
<filename>postgres_fdw</filename> obtains row count and cost estimates from the
remote server and then adds <literal>fdw_startup_cost</literal> and
<literal>fdw_tuple_cost</literal> to the cost estimates. When
<literal>use_remote_estimate</literal> is false,
<filename>postgres_fdw</filename> performs local row count and cost estimation
and then adds <literal>fdw_startup_cost</literal> and
<literal>fdw_tuple_cost</literal> to the cost estimates. This local
estimation is unlikely to be very accurate unless local copies of the
remote table's statistics are available. Running
<xref linkend="sql-analyze"/> on the foreign table is the way to update
the local statistics; this will perform a scan of the remote table and
then calculate and store statistics just as though the table were local.
Keeping local statistics can be a useful way to reduce per-query planning
overhead for a remote table — but if the remote table is
frequently updated, the local statistics will soon be obsolete.
use_remote_estimate
がtrue
の時、postgres_fdw
はリモートサーバから行数とコスト推定値を取得し、それをfdw_startup_cost
とfdw_tuple_cost
に加算します。
一方、use_remote_estimate
がfalse
の時、postgres_fdw
はローカルの行数とコスト推定値を取得しfdw_startup_cost
とfdw_tuple_cost
をコスト推定値に加算します。
このローカルな推定は、リモートテーブルの統計情報のローカルコピーが利用可能でないと、正確である見込みはほとんどありません。
ローカルな統計情報を更新するには外部テーブルに対するANALYZEを実行します。これはリモートテーブルに対するスキャンを実行し、あたかもローカルなテーブルであるかのように統計情報の計算と保存を行います。
ローカルな統計情報を保存する事で、問い合わせの度にリモートテーブルの実行計画を作成するオーバーヘッドを削減する事ができます。
しかしながら、リモートテーブルの更新頻度が高ければローカルの統計情報はすぐに実態を反映しなくなるでしょう。
The following option controls how such an <command>ANALYZE</command>
operation behaves:
以下のオプションは、このようなANALYZE
操作の動作を制御します。
analyze_sampling
(string
)
This option, which can be specified for a foreign table or a foreign
server, determines if <command>ANALYZE</command> on a foreign table
samples the data on the remote side, or reads and transfers all data
and performs the sampling locally. The supported values
are <literal>off</literal>, <literal>random</literal>,
<literal>system</literal>, <literal>bernoulli</literal>
and <literal>auto</literal>. <literal>off</literal> disables remote
sampling, so all data are transferred and sampled locally.
<literal>random</literal> performs remote sampling using the
<literal>random()</literal> function to choose returned rows,
while <literal>system</literal> and <literal>bernoulli</literal> rely
on the built-in <literal>TABLESAMPLE</literal> methods of those
names. <literal>random</literal> works on all remote server versions,
while <literal>TABLESAMPLE</literal> is supported only since 9.5.
<literal>auto</literal> (the default) picks the recommended sampling
method automatically; currently it means
either <literal>bernoulli</literal> or <literal>random</literal>
depending on the remote server version.
このオプションは、外部テーブルまたはリモートサーバに対して指定できます。外部テーブルでのANALYZE
によるサンプリングがリモート側で行われるか、すべてのデータを読み取ってローカルでサンプリングするかを決定します。
サポートされている値は、off
、random
、system
、bernoulli
、auto
です。
off
はリモートサンプリングを無効にし、すべてのデータが転送されてローカルでサンプリングされます。
random
はrandom()
関数を使用してリモートサンプリングを実行し、返された行を選択します。一方、system
とbernoulli
はそれらの名前の組込みTABLESAMPLE
メソッドに依存します。
random
はすべてのリモートサーババージョンで動作し、TABLESAMPLE
は9.5以降でのみサポートされます。
auto
(デフォルト)は推奨されるサンプリング方法を自動的に選択します。現在はリモートサーバのバージョンに応じてbernoulli
またはrandom
のいずれかを意味します。
By default, only <literal>WHERE</literal> clauses using built-in operators and
functions will be considered for execution on the remote server. Clauses
involving non-built-in functions are checked locally after rows are
fetched. If such functions are available on the remote server and can be
relied on to produce the same results as they do locally, performance can
be improved by sending such <literal>WHERE</literal> clauses for remote
execution. This behavior can be controlled using the following option:
デフォルトでは、組み込みの演算子および関数を使ったWHERE
句のみがリモートサーバでの実行を考慮されます。
組み込みでない関数を含む句は、行が取得された後、ローカルで検査されます。
そのような関数がリモートサーバで利用でき、かつローカルで実行するのと同じ結果を生成すると信頼できるときは、そのようなWHERE
句をリモートでの実行のために送出することでパフォーマンスを向上することができます。
この動作は以下のオプションを使うことで制御できます。
extensions
(string
)This option is a comma-separated list of names of <productname>PostgreSQL</productname> extensions that are installed, in compatible versions, on both the local and remote servers. Functions and operators that are immutable and belong to a listed extension will be considered shippable to the remote server. This option can only be specified for foreign servers, not per-table. このオプションは、PostgreSQLの拡張で、ローカルとリモートの両方に、互換のバージョンがインストールされているものの名前のリストです。 IMMUTABLEで、列挙された拡張に属する関数と演算子は、リモートサーバに送出可能とみなされます。 このオプションは外部サーバについてのみ指定可能で、テーブル毎の指定ではありません。
When using the <literal>extensions</literal> option, <emphasis>it is the
user's responsibility</emphasis> that the listed extensions exist and behave
identically on both the local and remote servers. Otherwise, remote
queries may fail or behave unexpectedly.
extensions
オプションを使用する場合、列挙する拡張が存在し、かつローカルとリモートのサーバで同一の動作をするようにすることはユーザの責任です。
そうでない場合、リモートの問い合わせは失敗したり、期待と異なる動作をするかもしれません。
fetch_size
(integer
)
This option specifies the number of rows <filename>postgres_fdw</filename>
should get in each fetch operation. It can be specified for a foreign
table or a foreign server. The option specified on a table overrides
an option specified for the server.
The default is <literal>100</literal>.
このオプションは、postgres_fdw
が1回のフェッチの動作で何行のデータを取得するかを指定します。
これは外部テーブルあるいは外部サーバに対して指定できます。
テーブルに対して指定されたオプションは、サーバに対して指定されたオプションよりも優先します。
デフォルトは100
です。
batch_size
(integer
)
This option specifies the number of rows <filename>postgres_fdw</filename>
should insert in each insert operation. It can be specified for a
foreign table or a foreign server. The option specified on a table
overrides an option specified for the server.
The default is <literal>1</literal>.
このオプションは、postgres_fdw
が個々のINSERT操作で挿入する行数を指定します。
外部テーブルあるいは外部サーバに対して指定することができます。
テーブルに対してこのオプションを指定すると、サーバに対して指定されたオプションを上書きします。
デフォルトは1
です。
Note the actual number of rows <filename>postgres_fdw</filename> inserts at
once depends on the number of columns and the provided
<literal>batch_size</literal> value. The batch is executed as a single
query, and the libpq protocol (which <filename>postgres_fdw</filename>
uses to connect to a remote server) limits the number of parameters in a
single query to 65535. When the number of columns * <literal>batch_size</literal>
exceeds the limit, the <literal>batch_size</literal> will be adjusted to
avoid an error.
postgres_fdw
が実際に一度に挿入する行数は、列の数と指定されたbatch_size
値に依存することに注意してください。
一つのバッチは単一の問い合わせとして実行され、libpqプロトコル(postgres_fdw
がリモートサーバに接続するために使用します)は単一の問い合わせにおけるパラメータ数を65535に制限していることに注意してください。
列数 * batch_size
がその上限を超えると、エラーを回避するためにbatch_size
が調整されます。
This option also applies when copying into foreign tables. In that case
the actual number of rows <filename>postgres_fdw</filename> copies at
once is determined in a similar way to the insert case, but it is
limited to at most 1000 due to implementation restrictions of the
<command>COPY</command> command.
このオプションは、外部テーブルにコピーする場合にも適用されます。
その場合、postgres_fdw
が一度にコピーする実際の行数は、挿入する場合と類似した方法で決定されますが、COPY
コマンドの実装上の制限により1000以下に制限されます。
<filename>postgres_fdw</filename> supports asynchronous execution, which
runs multiple parts of an <structname>Append</structname> node
concurrently rather than serially to improve performance.
This execution can be controlled using the following option:
postgres_fdw
は非同期実行をサポートします。
これは性能を向上するために、複数のAppend
ノードの部分を順番にではなく、並行して実行します。
この実行は以下のオプションで制御できます。
async_capable
(boolean
)
This option controls whether <filename>postgres_fdw</filename> allows
foreign tables to be scanned concurrently for asynchronous execution.
It can be specified for a foreign table or a foreign server.
A table-level option overrides a server-level option.
The default is <literal>false</literal>.
このオプションは、postgres_fdw
が非同期実行の際に外部テーブルの並列スキャンを許すかどうかを制御します。
外部テーブルあるいは外部サーバに対して指定できます。
テーブルレベルのオプションはサーバレベルのオプションを上書きします。
デフォルトはfalse
です。
In order to ensure that the data being returned from a foreign server
is consistent, <filename>postgres_fdw</filename> will only open one
connection for a given foreign server and will run all queries against
that server sequentially even if there are multiple foreign tables
involved, unless those tables are subject to different user mappings.
In such a case, it may be more performant to disable this option to
eliminate the overhead associated with running queries asynchronously.
外部サーバから返却されるデータの一貫性を保証するために、postgres_fdw
は一つの外部サーバに対して一つの接続だけを開きます。
そして、テーブルが異なるユーザマッピングの対象でない限り、複数の外部テーブルが存在してもすべての問い合わせをサーバに対して順番に実行します。
この場合、問い合わせを非同期に実行することによるオーバーヘッドをなくすためにこのオプションを使用しないほうが性能が良くなるかもしれません。
Asynchronous execution is applied even when an
<structname>Append</structname> node contains subplan(s) executed
synchronously as well as subplan(s) executed asynchronously.
In such a case, if the asynchronous subplans are ones processed using
<filename>postgres_fdw</filename>, tuples from the asynchronous
subplans are not returned until after at least one synchronous subplan
returns all tuples, as that subplan is executed while the asynchronous
subplans are waiting for the results of asynchronous queries sent to
foreign servers.
This behavior might change in a future release.
Append
ノードに順次実行されるサブプランが含まれていても、あるいは非同期実行されるサブプランが含まれていても、非同期実行は適用されます。
このような場合では、非同期実行のサブプランがpostgres_fdw
を用いて処理されると、外部サーバに送信される非同期問い合わせの結果を非同期サブプランが待っている間に順次実行サブプランが実行されるため、少なくとも1つの順次実行サブプランがすべてのタプルを返すまでは、非同期実行サブプランによるタプルは返りません。
このふるまいは将来のリリースでは変更されるかもしれません。
As described in the Transaction Management section, in
<filename>postgres_fdw</filename> transactions are managed by creating
corresponding remote transactions, and subtransactions are managed by
creating corresponding remote subtransactions. When multiple remote
transactions are involved in the current local transaction, by default
<filename>postgres_fdw</filename> commits or aborts those remote
transactions serially when the local transaction is committed or aborted.
When multiple remote subtransactions are involved in the current local
subtransaction, by default <filename>postgres_fdw</filename> commits or
aborts those remote subtransactions serially when the local subtransaction
is committed or aborted.
Performance can be improved with the following options:
「トランザクション制御」節で説明されているように、postgres_fdw
では、トランザクションは対応するリモートトランザクションを作成することで制御され、サブトランザクションは対応するリモートサブトランザクションを作成することで制御されます。
現在のローカルトランザクションに複数のリモートトランザクションが含まれている場合、デフォルトではpostgres_fdw
はローカルトランザクションがコミットまたは中断されたときに、これらのリモートトランザクションを順番にコミットまたは中断します。
現在のローカルサブトランザクションに複数のリモートサブトランザクションが含まれている場合、デフォルトではpostgres_fdw
はローカルサブトランザクションがコミットまたは中断されたときに、これらのリモートサブトランザクションを順番にコミットまたは中断します。
次のオプションでパフォーマンスを向上させることができます。
parallel_commit
(boolean
)
This option controls whether <filename>postgres_fdw</filename> commits,
in parallel, remote transactions opened on a foreign server in a local
transaction when the local transaction is committed. This setting also
applies to remote and local subtransactions. This option can only be
specified for foreign servers, not per-table. The default is
<literal>false</literal>.
このオプションは、ローカルトランザクションがコミットされたときに、ローカルトランザクション内の外部サーバで開かれたリモートトランザクションをpostgres_fdw
が並行してコミットするかどうかを制御します。
この設定は、リモートサブトランザクションとローカルサブトランザクションにも適用されます。
このオプションは外部サーバに対してのみ指定でき、テーブル単位では指定できません。
デフォルトはfalse
です。
parallel_abort
(boolean
)
This option controls whether <filename>postgres_fdw</filename> aborts,
in parallel, remote transactions opened on a foreign server in a local
transaction when the local transaction is aborted. This setting also
applies to remote and local subtransactions. This option can only be
specified for foreign servers, not per-table. The default is
<literal>false</literal>.
このオプションは、ローカルトランザクションが中断されたときに、ローカルトランザクション内の外部サーバで開かれたリモートトランザクションをpostgres_fdw
が並行して中断するかどうかを制御します。
この設定は、リモートサブトランザクションとローカルサブトランザクションにも適用されます。
このオプションは外部サーバに対してのみ指定でき、テーブル単位では指定できません。
デフォルトはfalse
です。
If multiple foreign servers with these options enabled are involved in a local transaction, multiple remote transactions on those foreign servers are committed or aborted in parallel across those foreign servers when the local transaction is committed or aborted. このオプションが有効になっている複数の外部サーバがローカルトランザクションに関与している場合、これらの外部サーバ上の複数のリモートトランザクションは、ローカルトランザクションがコミットまたは中断されるときに、これらの外部サーバ間で並列にコミットまたは中断されます。
When these options are enabled, a foreign server with many remote transactions may see a negative performance impact when the local transaction is committed or aborted. このオプションを有効にすると、多数のリモートトランザクションを持つ外部サーバは、ローカルトランザクションがコミットまたは中断されたときにパフォーマンスが悪影響を受ける可能性があります。
By default all foreign tables using <filename>postgres_fdw</filename> are assumed
to be updatable. This may be overridden using the following option:
デフォルトではpostgres_fdw
を使用する全ての外部テーブルは更新可能であると想定されます。以下のオプションにより、この挙動を上書きする事ができます。
updatable
(boolean
)
This option controls whether <filename>postgres_fdw</filename> allows foreign
tables to be modified using <command>INSERT</command>, <command>UPDATE</command> and
<command>DELETE</command> commands. It can be specified for a foreign table
or a foreign server. A table-level option overrides a server-level
option.
The default is <literal>true</literal>.
このオプションは、postgres_fdw
がINSERT
、UPDATE
あるいはDELETE
コマンドを使用して外部テーブルを操作する事を許可するかどうかを規定します。
外部テーブルで指定されたオプションは、外部サーバにおいて指定されたオプションを上書きします。
デフォルト値はtrue
です。
Of course, if the remote table is not in fact updatable, an error
would occur anyway. Use of this option primarily allows the error to
be thrown locally without querying the remote server. Note however
that the <literal>information_schema</literal> views will report a
<filename>postgres_fdw</filename> foreign table to be updatable (or not)
according to the setting of this option, without any check of the
remote server.
もちろん、リモートテーブルが実際には更新可能ではなかった場合、いずれにしてもエラーが発生するでしょう。このオプションを使用することで、リモートサーバへの問い合わせを行う事なくローカルでエラーを発生させることができます。
また、information_schema
ビューは、このオプションの値に従ってpostgres_fdw
管理下の外部テーブルを更新可能(あるいは不可能)であるとレポートする事に留意してください。
リモートサーバ側のチェックは一切行われません。
By default all foreign tables using <filename>postgres_fdw</filename> are assumed
to be truncatable. This may be overridden using the following option:
デフォルトではpostgres_fdw
を使用する外部テーブルは切り詰め可能であると見なされます。
これは以下のオプションで変更が可能です。
truncatable
(boolean
)
This option controls whether <filename>postgres_fdw</filename> allows
foreign tables to be truncated using the <command>TRUNCATE</command>
command. It can be specified for a foreign table or a foreign server.
A table-level option overrides a server-level option.
The default is <literal>true</literal>.
このオプションはpostgres_fdw
が外部テーブルをTRUNCATE
を使って切り詰めることができるかどうかを制御します。
外部テーブルあるいは外部サーバに対して指定できます。
外部テーブルで指定されたオプションは、外部サーバにおいて指定されたオプションを上書きします。
デフォルトはtrue
です。
Of course, if the remote table is not in fact truncatable, an error would occur anyway. Use of this option primarily allows the error to be thrown locally without querying the remote server. もちろん外部テーブルが切り詰め不可能なら、結局エラーが生じます。 このオプションを使用することにより、リモートサーバに問い合わせることなくエラーをローカルで起こすことができるのが主な用途です。
<filename>postgres_fdw</filename> is able to import foreign table definitions
using <xref linkend="sql-importforeignschema"/>. This command creates
foreign table definitions on the local server that match tables or
views present on the remote server. If the remote tables to be imported
have columns of user-defined data types, the local server must have
compatible types of the same names.
postgres_fdw
はIMPORT FOREIGN SCHEMAを使って、外部テーブルの定義をインポートすることができます。
このコマンドは、リモートのサーバ上に存在するテーブルあるいはビューとマッチする外部テーブルの定義をローカルサーバ上に作成します。
インポートするリモートのテーブルにユーザ定義のデータ型の列がある場合、ローカルサーバにも同じ名前の互換性のある型がなければなりません。
Importing behavior can be customized with the following options
(given in the <command>IMPORT FOREIGN SCHEMA</command> command):
インポートの動作は以下のオプションでカスタマイズできます(IMPORT FOREIGN SCHEMA
コマンドで指定します)。
import_collate
(boolean
)
This option controls whether column <literal>COLLATE</literal> options
are included in the definitions of foreign tables imported
from a foreign server. The default is <literal>true</literal>. You might
need to turn this off if the remote server has a different set of
collation names than the local server does, which is likely to be the
case if it's running on a different operating system.
If you do so, however, there is a very severe risk that the imported
table columns' collations will not match the underlying data, resulting
in anomalous query behavior.
このオプションは、列のCOLLATE
オプションが、外部サーバからインポートする外部テーブルの定義に含まれているかどうかを制御します。
デフォルトはtrue
です。
リモートサーバとローカルサーバで照合順序の名前の集合が異なる場合は、この設定を無効にする必要があるでしょう。
リモートサーバが異なるOSで動作しているなら、そういうことがありそうです。
しかし、そうした時には、インポートしたテーブルの列の照合順序が実際のデータと一致せず、問い合わせの振る舞いが結果として異常になる大きなリスクがあります。
Even when this parameter is set to <literal>true</literal>, importing
columns whose collation is the remote server's default can be risky.
They will be imported with <literal>COLLATE "default"</literal>, which
will select the local server's default collation, which could be
different.
このパラメータがtrue
のときでさえ、照合順序がリモートサーバのデフォルトである列をインポートするのは危険性があります。
これらの列はCOLLATE "default"
としてインポートされますが、ローカルサーバのデフォルトの照合順序は異なるかもしれません。
import_default
(boolean
)
This option controls whether column <literal>DEFAULT</literal> expressions
are included in the definitions of foreign tables imported
from a foreign server. The default is <literal>false</literal>. If you
enable this option, be wary of defaults that might get computed
differently on the local server than they would be on the remote
server; <function>nextval()</function> is a common source of problems.
The <command>IMPORT</command> will fail altogether if an imported default
expression uses a function or operator that does not exist locally.
このオプションは、列のDEFAULT
式が外部サーバからインポートされる外部テーブルの定義に含まれているかどうかを制御します。
デフォルトはfalse
です。
このオプションを有効にする場合は、ローカルサーバとリモートサーバで異なる計算をされるデフォルトに注意して下さい。
nextval()
はよくある問題の一つです。
インポートされるデフォルト式がローカルには存在しない関数または演算子を使っていた場合、IMPORT
は失敗します。
import_generated
(boolean
)
This option controls whether column <literal>GENERATED</literal> expressions
are included in the definitions of foreign tables imported
from a foreign server. The default is <literal>true</literal>.
The <command>IMPORT</command> will fail altogether if an imported generated
expression uses a function or operator that does not exist locally.
このオプションは、外部サーバからインポートされた外部テーブルの定義にGENERATED
列式が含まれるかどうかを制御します。
デフォルトはtrue
です。
インポートされる生成式がローカルには存在しない関数あるいは演算子を使っていた場合、IMPORT
は失敗します。
import_not_null
(boolean
)
This option controls whether column <literal>NOT NULL</literal>
constraints are included in the definitions of foreign tables imported
from a foreign server. The default is <literal>true</literal>.
このオプションは、列のNOT NULL
制約が、外部サーバからインポートされる外部テーブルの定義に含まれているかどうかを制御します。
デフォルトはtrue
です。
Note that constraints other than <literal>NOT NULL</literal> will never be
imported from the remote tables. Although <productname>PostgreSQL</productname>
does support check constraints on foreign tables, there is no
provision for importing them automatically, because of the risk that a
constraint expression could evaluate differently on the local and remote
servers. Any such inconsistency in the behavior of a check
constraint could lead to hard-to-detect errors in query optimization.
So if you wish to import check constraints, you must do so
manually, and you should verify the semantics of each one carefully.
For more detail about the treatment of check constraints on
foreign tables, see <xref linkend="sql-createforeigntable"/>.
NOT NULL
以外の制約は決してリモートのテーブルからインポートされないことに注意して下さい。
PostgreSQLは外部テーブルのcheck制約をサポートしていますが、それを自動的にインポートする予定はありません。
なぜなら、制約の式はローカルとリモートのサーバで異なる評価をされる危険があるからです。
check制約でそのような一貫しない動作があると、問い合わせの最適化で検知するのが難しい誤りが発生するかもしれません。
そのため、check制約をインポートしたい場合は、それを手作業で実行する必要があり、またその一つ一つの意味を注意深く確認するべきです。
外部テーブルのcheck制約の取扱いについて、詳しくはCREATE FOREIGN TABLEを参照して下さい。
Tables or foreign tables which are partitions of some other table are
imported only when they are explicitly specified in
<literal>LIMIT TO</literal> clause. Otherwise they are automatically
excluded from <xref linkend="sql-importforeignschema"/>.
Since all data can be accessed through the partitioned table
which is the root of the partitioning hierarchy, importing only
partitioned tables should allow access to all the data without
creating extra objects.
他のテーブルのパーティションであるテーブルや外部テーブルは、明示的なLIMIT TO
句が指定されている場合にのみインポートされます。
そうでなければそれらは、IMPORT FOREIGN SCHEMAから自動的に除外されます。
パーティショニング化階層のルートであるパーティションテーブルを介してすべてのデータにアクセスできるため、パーティション化テーブルのみをインポートすることで余分なオブジェクトを作成せずにすべてのデータにアクセスできます。
By default, all connections that <filename>postgres_fdw</filename>
establishes to foreign servers are kept open in the local session
for re-use.
デフォルトではpostgres_fdw
が外部サーバに確立した接続は、再利用のためにローカルセッションにおいて開いたまま維持されます。
keep_connections
(boolean
)
This option controls whether <filename>postgres_fdw</filename> keeps
the connections to the foreign server open so that subsequent
queries can re-use them. It can only be specified for a foreign server.
The default is <literal>on</literal>. If set to <literal>off</literal>,
all connections to this foreign server will be discarded at the end of
each transaction.
このオプションは、後の再利用のためにpostgres_fdw
が外部サーバに対する接続を保持したままにしておくかどうかを制御します。
外部サーバに対してのみ指定ができます。
デフォルトはon
です。
off
に設定すると、この外部サーバに対するすべての接続は個々のトランザクションの終了時に破棄されます。
postgres_fdw_get_connections(OUT server_name text, OUT valid boolean) returns setof record
This function returns the foreign server names of all the open
connections that <filename>postgres_fdw</filename> established from
the local session to the foreign servers. It also returns whether
each connection is valid or not. <literal>false</literal> is returned
if the foreign server connection is used in the current local
transaction but its foreign server or user mapping is changed or
dropped (Note that server name of an invalid connection will be
<literal>NULL</literal> if the server is dropped),
and then such invalid connection will be closed at
the end of that transaction. <literal>true</literal> is returned
otherwise. If there are no open connections, no record is returned.
Example usage of the function:
この関数は、postgres_fdw
によってローカルセッションから外部サーバに確立されたすべての開いている接続の外部サーバ名を返します。
個々の接続が有効かどうかも返します。
外部サーバの接続が現在のローカルトランザクションで使用されていても、外部サーバあるいはユーザマッピングが変更あるいは削除されるとfalse
が返り(無効な接続のサーバ名は、サーバが削除されるとNULL
になることに注意してください)、そうした無効な接続はトランザクションの終了時に閉じられます。
そうでなければtrue
が返ります。
開いた接続がなければレコードは返りません。
関数の使用例を示します。
postgres=# SELECT * FROM postgres_fdw_get_connections() ORDER BY 1; server_name | valid -------------+------- loopback1 | t loopback2 | f
postgres_fdw_disconnect(server_name text) returns boolean
This function discards the open connections that are established by
<filename>postgres_fdw</filename> from the local session to
the foreign server with the given name. Note that there can be
multiple connections to the given server using different user mappings.
If the connections are used in the current local transaction,
they are not disconnected and warning messages are reported.
This function returns <literal>true</literal> if it disconnects
at least one connection, otherwise <literal>false</literal>.
If no foreign server with the given name is found, an error is reported.
Example usage of the function:
この関数は、postgres_fdw
によってローカルセッションから指定された名前の外部サーバに確立された開いている接続を破棄します。
異なるユーザマッピングを使用することにより、指定されたサーバに複数の接続が存在する可能性があることに注意してください。
現在のローカルトランザクションで接続が使われている場合は、接続は切断されず、警告メッセージが報告されます。
少なくとも1つの接続が切断されると、この関数はtrue
を返し、そうでない場合はfalse
を返します。
指定した名前の外部サーバが存在しなければ、エラーが報告されます。
この関数の使用例を示します。
postgres=# SELECT postgres_fdw_disconnect('loopback1'); postgres_fdw_disconnect ------------------------- t
postgres_fdw_disconnect_all() returns boolean
This function discards all the open connections that are established by
<filename>postgres_fdw</filename> from the local session to
foreign servers. If the connections are used in the current local
transaction, they are not disconnected and warning messages are reported.
This function returns <literal>true</literal> if it disconnects
at least one connection, otherwise <literal>false</literal>.
Example usage of the function:
この関数は、postgres_fdw
によってローカルセッションから外部サーバに確立されたすべての開いている接続を破棄します。
現在のローカルトランザクションで接続が使われている場合は、接続は切断されず、警告メッセージが報告されます。
少なくとも1つの接続が切断されると、この関数はtrue
を返します。
さもなければfalse
が返ります。
この関数の使用例を示します。
postgres=# SELECT postgres_fdw_disconnect_all(); postgres_fdw_disconnect_all ----------------------------- t
<filename>postgres_fdw</filename> establishes a connection to a
foreign server during the first query that uses a foreign table
associated with the foreign server. By default this connection
is kept and re-used for subsequent queries in the same session.
This behavior can be controlled using
<literal>keep_connections</literal> option for a foreign server. If
multiple user identities (user mappings) are used to access the foreign
server, a connection is established for each user mapping.
postgres_fdw
は、外部サーバに関連付けられた外部テーブルを参照するクエリを最初に実行する際に、外部サーバへの接続を確立します。
デフォルトではこの接続は保持され、同じセッションで以降の問い合わせのために再利用されます。
この振る舞いは外部サーバのkeep_connections
オプションを使って制御できます。
しかし、外部サーバへのアクセスに対して複数のユーザ識別子(ユーザマッピング)が使用される場合には、接続はユーザマッピング毎に確立される事になります。
When changing the definition of or removing a foreign server or a user mapping, the associated connections are closed. But note that if any connections are in use in the current local transaction, they are kept until the end of the transaction. Closed connections will be re-established when they are necessary by future queries using a foreign table. 外部サーバあるいはユーザマッピングの定義を変更ないし削除している場合は、関連する接続は閉じられます。 しかし、現在のローカルトランザクションが接続を使っていると、接続はトランザクションが終了するまでは維持されることに注意してください。 このあと外部テーブルを使用する問い合わせで必要になれば、閉じた接続は再び確立されます。
Once a connection to a foreign server has been established,
it's by default kept until the local or corresponding remote
session exits. To disconnect a connection explicitly,
<literal>keep_connections</literal> option for a foreign server
may be disabled, or
<function>postgres_fdw_disconnect</function> and
<function>postgres_fdw_disconnect_all</function> functions
may be used. For example, these are useful to close
connections that are no longer necessary, thereby releasing
connections on the foreign server.
ひとたび外部サーバに接続が確立されると、デフォルトではローカルあるいは関連するリモートセッションが終了するまで接続は維持されます。
明示的に接続を切断するには外部サーバのkeep_connections
オプションを無効にするか、postgres_fdw_disconnect
関数あるいはpostgres_fdw_disconnect_all
関数を使用します。
たとえば、必要がなくなった接続を切断し、それによって外部サーバの接続を開放するのにこれらの関数が役に立ちます。
During a query that references any remote tables on a foreign server,
<filename>postgres_fdw</filename> opens a transaction on the
remote server if one is not already open corresponding to the current
local transaction. The remote transaction is committed or aborted when
the local transaction commits or aborts. Savepoints are similarly
managed by creating corresponding remote savepoints.
外部サーバ上のリモートテーブルを参照する際に、まだトランザクションが開始されていなければpostgres_fdw
はリモートサーバ上でトランザクションを開始します。
ローカルのトランザクションがコミット、あるいはアボートした時、リモートのトランザクションも同様にコミット、あるいはアボートします。
セーブポイントも同様に管理され、リモート側に関連付けられたセーブポイントが作成されます。
The remote transaction uses <literal>SERIALIZABLE</literal>
isolation level when the local transaction has <literal>SERIALIZABLE</literal>
isolation level; otherwise it uses <literal>REPEATABLE READ</literal>
isolation level. This choice ensures that if a query performs multiple
table scans on the remote server, it will get snapshot-consistent results
for all the scans. A consequence is that successive queries within a
single transaction will see the same data from the remote server, even if
concurrent updates are occurring on the remote server due to other
activities. That behavior would be expected anyway if the local
transaction uses <literal>SERIALIZABLE</literal> or <literal>REPEATABLE READ</literal>
isolation level, but it might be surprising for a <literal>READ
COMMITTED</literal> local transaction. A future
<productname>PostgreSQL</productname> release might modify these rules.
ローカルトランザクションがSERIALIZABLE
分離レベルを用いている時、リモートトランザクションもSERIALIZABLE
分離レベルを使用します。
それ以外の場合にはREPEATABLE READ
分離レベルを使用します。
これは、あるクエリが複数のテーブルスキャンをリモート側で行う際に、確実に全てのスキャンにおいて一貫したスナップショットで結果を取り出すためです。
その結果、別の要求によってリモートサーバ側で競合する更新が発生したとしても、あるトランザクション内の問い合わせはリモートサーバからの一貫したデータを参照する事となります。
ローカルのトランザクションがSERIALIZABLE
あるいはREPEATABLE READ
分離レベルを用いている場合、この動作は期待通りのものでしょう。
一方、ローカルのトランザクションがREAD COMMITTED
分離レベルを使用している場合には、予想外の動作かもしれません。
将来のPostgreSQLリリースではこれらのルールに変更が加えられるかもしれません。
Note that it is currently not supported by
<filename>postgres_fdw</filename> to prepare the remote transaction for
two-phase commit.
postgres_fdw
は今のところ、二相コミットのためのリモートトランザクションの準備をサポートしていないことに注意して下さい。
<filename>postgres_fdw</filename> attempts to optimize remote queries to reduce
the amount of data transferred from foreign servers. This is done by
sending query <literal>WHERE</literal> clauses to the remote server for
execution, and by not retrieving table columns that are not needed for
the current query. To reduce the risk of misexecution of queries,
<literal>WHERE</literal> clauses are not sent to the remote server unless they use
only data types, operators, and functions that are built-in or belong to an
extension that's listed in the foreign server's <literal>extensions</literal>
option. Operators and functions in such clauses must
be <literal>IMMUTABLE</literal> as well.
For an <command>UPDATE</command> or <command>DELETE</command> query,
<filename>postgres_fdw</filename> attempts to optimize the query execution by
sending the whole query to the remote server if there are no query
<literal>WHERE</literal> clauses that cannot be sent to the remote server,
no local joins for the query, no row-level local <literal>BEFORE</literal> or
<literal>AFTER</literal> triggers or stored generated columns on the target
table, and no <literal>CHECK OPTION</literal> constraints from parent
views. In <command>UPDATE</command>,
expressions to assign to target columns must use only built-in data types,
<literal>IMMUTABLE</literal> operators, or <literal>IMMUTABLE</literal> functions,
to reduce the risk of misexecution of the query.
外部サーバからのデータ転送量を削減するため、postgres_fdw
はリモート問い合わせを最適化しようと試みます。
これは問い合わせのWHERE
句をリモートサーバに送出する事、およびクエリで必要とされていないカラムを取得しない事により行われます。
問い合わせの誤作動のリスクを下げるため、組み込みあるいは外部サーバのextensions
オプションに列挙されている拡張に属するデータ型、演算子、関数だけを用いたものでない限り、リモートサーバにWHERE
句は送出されません。
また、そのようなWHERE
句で使われる演算子と関数はIMMUTABLE
でなければなりません。
UPDATE
あるいはDELETE
の問い合わせについては、リモートサーバに送出できないWHERE
句がなく、問い合わせにローカルな結合がなく、対象のテーブルにローカルな行レベルのBEFORE
あるいはAFTER
トリガーや格納された生成列がなく、親ビューからのCHECK OPTION
制約がないのであれば、postgres_fdw
は問い合わせ全体をリモートサーバに送出することで、問い合わせの実行の最適化を図ります。
UPDATE
では、問い合わせの誤った実行のリスクを低減するため、対象列への代入式では組み込みのデータ型、IMMUTABLE
演算子、IMMUTABLE
関数のみを使わなければなりません。
When <filename>postgres_fdw</filename> encounters a join between foreign tables on
the same foreign server, it sends the entire join to the foreign server,
unless for some reason it believes that it will be more efficient to fetch
rows from each table individually, or unless the table references involved
are subject to different user mappings. While sending the <literal>JOIN</literal>
clauses, it takes the same precautions as mentioned above for the
<literal>WHERE</literal> clauses.
同一の外部サーバ上の外部テーブルの間の結合がある場合、postgres_fdw
はその結合全体を外部サーバに送出します。
ただし、何らかの理由で各テーブルから個別に行を取得する方が効率的だと思われる場合、あるいは結合に含まれるテーブルの参照が異なるユーザマッピングに従う場合を除きます。
JOIN
句を送出するにあたり、WHERE
句に関して上で説明したことと同じ注意が払われます。
The query that is actually sent to the remote server for execution can
be examined using <command>EXPLAIN VERBOSE</command>.
リモートサーバでの実行のために実際に送出される問い合わせはEXPLAIN VERBOSE
を用いて調べる事ができます。
In the remote sessions opened by <filename>postgres_fdw</filename>,
the <xref linkend="guc-search-path"/> parameter is set to
just <literal>pg_catalog</literal>, so that only built-in objects are visible
without schema qualification. This is not an issue for queries
generated by <filename>postgres_fdw</filename> itself, because it always
supplies such qualification. However, this can pose a hazard for
functions that are executed on the remote server via triggers or rules
on remote tables. For example, if a remote table is actually a view,
any functions used in that view will be executed with the restricted
search path. It is recommended to schema-qualify all names in such
functions, or else attach <literal>SET search_path</literal> options
(see <xref linkend="sql-createfunction"/>) to such functions
to establish their expected search path environment.
postgres_fdw
が開いたリモートセッションでは、search_pathパラメータはpg_catalog
にだけ設定されますので、スキーマで修飾しなければ組み込みオブジェクトだけが可視です。
postgres_fdw
自身が生成した問い合わせでは、常にそのような修飾を行ないますので、これは問題になりません。
しかし、リモートテーブルのトリガやルールによってリモートサーバ上で実行された関数にとっては問題の原因となり得ます。
例えば、リモートテーブルが実際にはビューであれば、そのビューで使われている関数はすべて制限された検索パスで実行されるでしょう。
期待される検索パス環境を確立できるよう、そのような関数では名前はすべてスキーマ修飾するか、そのような関数にSET search_path
オプション(CREATE FUNCTION参照)を付けることをお薦めします。
<filename>postgres_fdw</filename> likewise establishes remote session settings
for various parameters:
postgres_fdw
は、同様に様々なパラメータでリモートセッション設定を確立します。
<xref linkend="guc-timezone"/> is set to <literal>UTC</literal>
TimeZoneはUTC
に設定されます。
<xref linkend="guc-datestyle"/> is set to <literal>ISO</literal>
DateStyleはISO
に設定されます。
<xref linkend="guc-intervalstyle"/> is set to <literal>postgres</literal>
IntervalStyleはpostgres
に設定されます。
<xref linkend="guc-extra-float-digits"/> is set to <literal>3</literal> for remote
servers 9.0 and newer and is set to <literal>2</literal> for older versions
extra_float_digitsはリモートサーバが9.0以上では3
に設定され、それより古いバージョンでは2
に設定されます。
These are less likely to be problematic than <varname>search_path</varname>, but
can be handled with function <literal>SET</literal> options if the need arises.
これはsearch_path
ほど問題にはならないでしょうが、もし必要になったら関数のSET
オプションで処理してください。
It is <emphasis>not</emphasis> recommended that you override this behavior by
changing the session-level settings of these parameters; that is likely
to cause <filename>postgres_fdw</filename> to malfunction.
上のパラメータのセッションレベルの設定を変更することで、この振舞いを覆すことはお薦めしません。
postgres_fdw
が正常に動作しない原因となるでしょう。
<filename>postgres_fdw</filename> can be used with remote servers dating back
to <productname>PostgreSQL</productname> 8.3. Read-only capability is available
back to 8.1. A limitation however is that <filename>postgres_fdw</filename>
generally assumes that immutable built-in functions and operators are
safe to send to the remote server for execution, if they appear in a
<literal>WHERE</literal> clause for a foreign table. Thus, a built-in
function that was added since the remote server's release might be sent
to it for execution, resulting in <quote>function does not exist</quote> or
a similar error. This type of failure can be worked around by
rewriting the query, for example by embedding the foreign table
reference in a sub-<literal>SELECT</literal> with <literal>OFFSET 0</literal> as an
optimization fence, and placing the problematic function or operator
outside the sub-<literal>SELECT</literal>.
postgres_fdw
のリモートサーバにはPostgreSQL 8.3以降のバージョンを使用する事ができます。
読み取り専用であれば、8.1以降のバージョンまで可能です。
一方、postgres_fdw
はIMMUTABLE
属性を持った組み込みの演算子と関数が外部テーブルのWHERE
句に含まれる場合、リモート側で実行しても安全であると仮定します。そのため、リモートサーバのリリース後に追加された関数が実行のために送出されるかもしれず、結果として「関数が見つかりません」あるいは類するエラーを発生させる事になります。
この種の問題は問い合わせの書き換えによって対処する事ができます。
例えば、最適化を妨げるため、外部テーブルへの参照をOFFSET 0
を付けてsub-SELECT
に埋め込み、問題のある関数や演算子をsub-SELECT
の外に配置するなどの方法があります。
<filename>postgres_fdw</filename> can report the following wait events
under the wait event type <literal>Extension</literal>:
《機械翻訳》postgres_fdw
は、待機イベント型Extension
の下で以下の待機イベントを報告できます。
PostgresFdwCleanupResult
Waiting for transaction abort on remote server. 《機械翻訳》リモート サーバでトランザクションの中断を待機しています。
PostgresFdwConnect
Waiting to establish a connection to a remote server. 《機械翻訳》リモート サーバへの接続を確立するまで待機しています。
PostgresFdwGetResult
Waiting to receive the results of a query from a remote server. 《機械翻訳》リモート・サーバからのクエリ結果を待機中。
postgres_fdw.application_name
(string
)
#
Specifies a value for <xref linkend="guc-application-name"/>
configuration parameter used when <filename>postgres_fdw</filename>
establishes a connection to a foreign server. This overrides
<varname>application_name</varname> option of the server object.
Note that change of this parameter doesn't affect any existing
connections until they are re-established.
postgres_fdw
が外部サーバへの接続を確立する際に使用されるapplication_name設定パラメータの値を指定します。
これにより、サーバオブジェクトのapplication_name
オプションが上書きされます。
このパラメータを変更しても、再確立されるまで既存の接続には影響しません。
<varname>postgres_fdw.application_name</varname> can be any string
of any length and contain even non-ASCII characters. However when
it's passed to and used as <varname>application_name</varname>
in a foreign server, note that it will be truncated to less than
<symbol>NAMEDATALEN</symbol> characters.
Anything other than printable ASCII characters are replaced with <link
linkend="sql-syntax-strings-escape">C-style hexadecimal escapes</link>.
See <xref linkend="guc-application-name"/> for details.
postgres_fdw.application_name
は任意の長さの文字列で、非ASCII文字も含むことさえできます。
しかし、外部サーバでapplication_name
として渡されて使用される場合、NAMEDATALEN
文字未満に切り捨てられることに注意してください。
印字可能なASCII文字以外の文字はC言語形式の16進数エスケープ文字に置き換えられます。
詳細はapplication_nameを参照してください。
<literal>%</literal> characters begin <quote>escape sequences</quote>
that are replaced with status information as outlined below.
Unrecognized escapes are ignored. Other characters are copied straight
to the application name. Note that it's not allowed to specify a
plus/minus sign or a numeric literal after the <literal>%</literal>
and before the option, for alignment and padding.
%
文字は「エスケープシーケンス」を開始し、以下で説明するようにステータス情報に置き換えられます。
認識されないエスケープは無視されます。
他の文字はアプリケーション名に直接コピーされます。
位置合わせとパディングのために、%
の後とオプションの前にプラス/マイナス記号または数値リテラルを指定することはできないことに注意してください。
エスケープ | 効果 |
---|---|
%a | ローカルサーバ上のアプリケーション名 |
%c | Session ID on local server (see <xref linkend="guc-log-line-prefix"/> for details) ローカルサーバ上のセッションID(詳細はlog_line_prefixを参照) |
%C | Cluster name on local server (see <xref linkend="guc-cluster-name"/> for details) ローカルサーバ上のクラスタ名(詳細はcluster_nameを参照) |
%u | ローカルサーバ上のユーザ名 |
%d | ローカルサーバ上のデータベース名 |
%p | ローカルサーバ上のバックエンドのプロセスID |
%% | 文字 % |
For example, suppose user <literal>local_user</literal> establishes
a connection from database <literal>local_db</literal> to
<literal>foreign_db</literal> as user <literal>foreign_user</literal>,
the setting <literal>'db=%d, user=%u'</literal> is replaced with
<literal>'db=local_db, user=local_user'</literal>.
たとえば、ユーザlocal_user
がデータベースlocal_db
からforeign_db
への接続をユーザforeign_user
として確立するとします。
設定'db=%d,user=%u'
は'db=local_db,user=local_user'
に置き換えられます。
Here is an example of creating a foreign table with
<literal>postgres_fdw</literal>. First install the extension:
これはpostgres_fdw
で外部テーブルを作成する例です。
まず、拡張をインストールします。
CREATE EXTENSION postgres_fdw;
Then create a foreign server using <xref linkend="sql-createserver"/>.
In this example we wish to connect to a <productname>PostgreSQL</productname> server
on host <literal>192.83.123.89</literal> listening on
port <literal>5432</literal>. The database to which the connection is made
is named <literal>foreign_db</literal> on the remote server:
次に、CREATE SERVERを使って外部サーバを作成します。
この例では、ホスト192.83.123.89
でポート5432
を監視しているPostgreSQLサーバに接続します。
接続されるデータベースはリモートサーバ上でforeign_db
という名前です。
CREATE SERVER foreign_server FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host '192.83.123.89', port '5432', dbname 'foreign_db');
A user mapping, defined with <xref linkend="sql-createusermapping"/>, is needed as well to identify the role that will be used on the remote server: リモートサーバで使われるロールを特定するためにユーザマッピングも必要です。ユーザマッピングはCREATE USER MAPPINGで定義されます。
CREATE USER MAPPING FOR local_user SERVER foreign_server OPTIONS (user 'foreign_user', password 'password');
Now it is possible to create a foreign table with
<xref linkend="sql-createforeigntable"/>. In this example we
wish to access the table named <structname>some_schema.some_table</structname>
on the remote server. The local name for it will
be <structname>foreign_table</structname>:
これでCREATE FOREIGN TABLEにより外部テーブルが作成できるようになりました。
この例では、リモートサーバのsome_schema.some_table
という名前のテーブルにアクセスします。
対応するローカルの名前はforeign_table
です。
CREATE FOREIGN TABLE foreign_table ( id integer NOT NULL, data text ) SERVER foreign_server OPTIONS (schema_name 'some_schema', table_name 'some_table');
It's essential that the data types and other properties of the columns
declared in <command>CREATE FOREIGN TABLE</command> match the actual remote table.
Column names must match as well, unless you attach <literal>column_name</literal>
options to the individual columns to show how they are named in the remote
table.
In many cases, use of <link linkend="sql-importforeignschema"><command>IMPORT FOREIGN SCHEMA</command></link> is
preferable to constructing foreign table definitions manually.
CREATE FOREIGN TABLE
で宣言した列のデータ型やその他の属性は、実際のリモートテーブルと一致していることが必須です。
リモートテーブルでどのような名前なのかを個々の列に対してcolumn_name
オプションで指定しない限り、列名も一致していなければなりません。
多くの場合、外部テーブルの定義を手作業で作成するよりも、IMPORT FOREIGN SCHEMA
を使用する方が望ましいです。
Shigeru Hanada <email>shigeru.hanada@gmail.com</email>
花田 茂 <shigeru.hanada@gmail.com>