Timestamp-based snapshots
=========================

タイムスタンプベースのスナップショットでは、通常のMVCCスナップショットではなくユーザー指定のタイムスタンプを使用して、一貫した方法でデータを読み取ることができます。この機能を使用して、共通の時点でさまざまなPGDノード上のデータにアクセスできます。たとえば、データ品質チェックのために複数のノード上のデータを比較できます。

この機能は現在、書き込みトランザクションでは動作しません。

``snapshot_timestamp``
パラメーターを使用して、タイムスタンプベースのスナップショットの使用を有効にします。このパラメーターは、タイムスタンプ値または現在のタイムスタンプnowを表す特別な値\ ``'current'``
を受け入れます。 ``snapshot_timestamp``
が設定されている場合、クエリーはそのタイムスタンプを使用して、通常のMVCCセマンティクスではなく行の可視性を判断します。

たとえば、次のクエリーは、2018-12-08 02:28:30 GMTでの\ ``customers``
テーブルの状態を結果ます。

.. code:: sql

   SET snapshot_timestamp = 2018-12-08 02:28:30 GMT;
   SELECT count(*) FROM customers;

PGDがないと、このクエリーは将来のタイムスタンプまたは特別な\ ``'current'``
値でのみ動作するため、履歴クエリーには使用できません。

PGDは、マルチノード環境でのその機能と連携し、改善します。最初に、
PGDは、他のノードへのすべての接続が、指定されたタイムスタンプより前にデータベースに追加された未処理のデータをレプリケートすることを確認します。これにより、タイムスタンプベースのスナップショットがマルチマスターグループ全体で一貫していることが保証されます。次に、
PGDは\ ``bdr.timestamp_snapshot_keep``
というパラメーターを追加します。このパラメーターは、そのノードで最近の履歴に対してクエリーを実行できる時間枠を指定します。

任意の間隔を指定できますが、
VACUUM自動バキュームを含むは、指定された間隔の最大2倍より新しいデッド行はクリーニングしないことに注意してください。これは、トランザクションIDが同じ時間解放されないことも意味します。その結果、これを使用すると、ユーザーテーブルがさらに肥大化する可能性があります。最初は一般的な設定として10秒をお勧めしますが、必要に応じて変更できます。

クエリーが実行のために受け入れられると、クエリーは通常と同じように問題なく\ ``bdr.timestamp_snapshot_keep``
より長く実行される場合があります。

また、スナップショットがどこまで保持されたかに関する情報は、サーバーを再起動すると残されません。タイムスタンプベースのスナップショットの最も古い使用可能なタイムスタンプは、PostgreSQLインスタンスが最後に再起動された時刻です。

``bdr.timestamp_snapshot_keep`` の使用と\ ``postgres_fdw``
拡張機能を組み合わせて、PGDグループ内のマルチプルのノードにわたって一貫した読み取りを取得できます。外部テーブルで使用する場合、この組み合わせを使用して、ノード全体で並列クエリーを実行できます。

この機能を使用する場合、マルチノードクエリ内のノードの数に制限はありません。

タイムスタンプベースのスナップショットを使用しても、ノード間トラフィックや帯域幅は増加しません。クエリデータに加えて、タイムスタンプ値のみが渡されます。
