非決定性SQL

SQL文がセット内のすべてのレプリケーション・ノードで実行されたときに同じ結果を返さない場合、レプリケーション・セットでは非決定的です。 SQL文に非決定式が含まれている場合、式の値ごとのレプリケーションが実行されます。

レプリケートされたデータに対して、あらゆる形式のステートメント・タイムスタンプ(例えば、CURRENT_TIMESTAMP関数やTIMETZ関数の呼び出し)を使用した更新がサポートされています。 ステートメントのタイムスタンプは、クエリを実行するプライマリ NPS® システム上で評価される文字列リテラルとして複製される。 リテラルはプライマリのタイムゾーンで解釈されるため、プライマリとレプリカのタイムゾーンが異なる場合、2つのサイトは異なる絶対時間またはUTC時間を表す同一の表示時間を持つ。 例えば、プライマリのタイムゾーンがEDTに設定されている場合、値はEDTで記録される。 p.m 4時18分とする。 レプリカのタイムゾーンがPDTの場合、時刻はプライマリより3時間早いp.m 1時18分となる。 時刻を値で扱い、プライマリはp.m 4時18分という値を送信し、レプリカはそれを受信する、 これはレプリカの絶対時間とは異なる。

以下の項目は常に値によって複製される:
  • LIMIT キーワード
  • NEXT VALUE IN <sequence>
  • ユーザー定義集計(UDA)およびユーザー定義テーブル関数(UDTF)
  • 特別な列 DatasliceID, RowID, CreateTxID, DeleteTxID, _extentID, _ pageID )。ただし、クエリがバージョン管理されたテーブルから選択する場合を除く
  • 非決定論的であると検出されたユーザーから見えるシステム関数
  • Current_DBID、Current_SID、Current_USERID、Current_USEROID関数

UDF、UDA、そして非決定性

ユーザー定義関数(UDF)は、UDF登録時または CREATE FUNCTIONALTER FUNCTION コマンドで指定した決定論的設定( --nondet) )を使用して処理されます。 関数が決定論的であれば、その関数に対してSQLによるレプリケーションが適用され、非決定論的であれば、トランザクション全体に対して値によるレプリケーションが選択される。 レプリケートされたデータベースの一時的でないテーブルを変更するトランザクションでユーザー定義集約(UDA)を使用すると、常に値によるレプリケーションがトリガーされます。 バイSQLトランザクションは、ソフトウェアが非決定論的な関数呼び出しまたは非複製データ参照を1つでも検出すると、バイ値トランザクションになる。

UDFが決定論的であると指定した場合( --nondet オプションを使用しない)、そうでない場合はSQLによるレプリケーションが適用されます。 しかし、UDFの実行がプライマリとレプリカで異なる場合、プライマリとレプリカでデータの発散が発生する可能性がある。 その場合、問題を解決するためにバックアップとリストアが必要となる。 このため、関数に非決定性SQLが含まれているかどうか不明な場合、登録時に --nondet 。 詳細と例については、 ユーザー定義関数を参照してください。

非決定的なビュー設定

Postgresの関数情報は_v_functionシステムビューからアクセスできます。 v_functionビュー内の以下のフラグは、非決定論的SQLの検出と処理に関連しています。
表1.決定論に関連する_v_functionビューフラグ
名前 説明
表示 その関数がユーザーによって可視化されているかどうかを示す。 非決定性SQLチェックは、ユーザーから見える関数に対してのみ行われる。
決定論 関数が決定論的であるかどうかを示す。 NPSオプティマイザは、このフラグを使用して評価アルゴリズムを選択する。 非決定論的SQL検査アルゴリズムは、このフラグを参照するが、完全にこのフラグに基づいているわけではない。 関数はこのテストには合格しても、他のチェックでは不合格になるかもしれない(例えば、他の関数と組み合わせて使用した場合など)。 非決定的な場合、その関数は値によって処理される。
その他、以下の行動が適用される:
  • CURRENT_DBID、CURRENT_SID、CURRENT_USERID、CURRENT_USEROIDを除く、決定論的フラグがtrueに設定されたすべてのユーザー可視関数は、レプリケーション環境において決定論的です。 プライマリとレプリカが同じオブジェクトIDを持つことが保証されていないため、これら4つの関数には例外が適用される。
  • 決定論的フラグがfalseに設定されているユーザーから見える関数は、タイムスタンプ関連の関数を除き、レプリケーション環境ではすべて非決定論的である。
  • 文のタイムスタンプの一部または変換を返す、ユーザーから見えるすべての関数は、決定論的フラグに関係なく、レプリケーション環境で複製され、決定論的である。