非決定性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 FUNCTION 、 ALTER FUNCTION コマンドで指定した決定論的設定( --nondet) )を使用して処理されます。 関数が決定論的であれば、その関数に対してSQLによるレプリケーションが適用され、非決定論的であれば、トランザクション全体に対して値によるレプリケーションが選択される。 レプリケートされたデータベースの一時的でないテーブルを変更するトランザクションでユーザー定義集約(UDA)を使用すると、常に値によるレプリケーションがトリガーされます。 バイSQLトランザクションは、ソフトウェアが非決定論的な関数呼び出しまたは非複製データ参照を1つでも検出すると、バイ値トランザクションになる。
UDFが決定論的であると指定した場合( --nondet オプションを使用しない)、そうでない場合はSQLによるレプリケーションが適用されます。 しかし、UDFの実行がプライマリとレプリカで異なる場合、プライマリとレプリカでデータの発散が発生する可能性がある。 その場合、問題を解決するためにバックアップとリストアが必要となる。 このため、関数に非決定性SQLが含まれているかどうか不明な場合、登録時に --nondet 。 詳細と例については、 ユーザー定義関数を参照してください。
非決定的なビュー設定
| 名前 | 説明 |
|---|---|
| 表示 | その関数がユーザーによって可視化されているかどうかを示す。 非決定性SQLチェックは、ユーザーから見える関数に対してのみ行われる。 |
| 決定論 | 関数が決定論的であるかどうかを示す。 NPSオプティマイザは、このフラグを使用して評価アルゴリズムを選択する。 非決定論的SQL検査アルゴリズムは、このフラグを参照するが、完全にこのフラグに基づいているわけではない。 関数はこのテストには合格しても、他のチェックでは不合格になるかもしれない(例えば、他の関数と組み合わせて使用した場合など)。 非決定的な場合、その関数は値によって処理される。 |
- CURRENT_DBID、CURRENT_SID、CURRENT_USERID、CURRENT_USEROIDを除く、決定論的フラグがtrueに設定されたすべてのユーザー可視関数は、レプリケーション環境において決定論的です。 プライマリとレプリカが同じオブジェクトIDを持つことが保証されていないため、これら4つの関数には例外が適用される。
- 決定論的フラグがfalseに設定されているユーザーから見える関数は、タイムスタンプ関連の関数を除き、レプリケーション環境ではすべて非決定論的である。
- 文のタイムスタンプの一部または変換を返す、ユーザーから見えるすべての関数は、決定論的フラグに関係なく、レプリケーション環境で複製され、決定論的である。