このページでは、PostgreSQL 言語データベースで Spanner を使用して実行する挿入オペレーションと更新オペレーションごとに commit タイムスタンプを書き込む方法について説明します。
commit のタイムスタンプを挿入する
TrueTime テクノロジに基づく commit タイムスタンプは、トランザクションがデータベースに commit された時刻を表します。トランザクションの commit タイムスタンプを列にアトミックに格納できます。テーブルに格納された commit タイムスタンプを使用すると、ミューテーションの正確な順序を確認し、変更履歴のような機能を構築できます。
データベースに commit タイムスタンプを挿入するには、次の手順に沿って操作します。
SPANNER.COMMIT_TIMESTAMPタイプの列を作成します。次に例を示します。CREATE TABLE Performances ( ... LastUpdateTime SPANNER.COMMIT_TIMESTAMP NOT NULL, ... PRIMARY KEY (...) ) ;DML を使用して挿入や更新を実行する場合は、
SPANNER.PENDING_COMMIT_TIMESTAMP()関数を使用して commit タイムスタンプを書き込みます。あらかじめ準備されたステートメントまたはミューテーションを使用して挿入または更新を実行する場合は、commit タイムスタンプ列にプレースホルダ文字列
SPANNER.COMMIT_TIMESTAMP()を使用します。クライアント ライブラリによって提供される commit タイムスタンプ定数を使用することもできます。たとえば、Java クライアントではこの定数はValue.COMMIT_TIMESTAMPです。
Spanner で、これらのプレースホルダを列の値として使用してトランザクションを commit すると、実際の commit タイムスタンプが指定された列に書き込まれます。この列の値を使用して、テーブルの更新履歴を作成できます。
commit タイムスタンプの値は一意であるとは限りません。重複しない一連のフィールドに書き込むトランザクションの場合、同じタイムスタンプが存在する可能性があります。重複する一連のフィールドに書き込むトランザクションの場合は、タイムスタンプは一意になります。
Spanner の commit タイムスタンプはマイクロ秒単位の精度で、SPANNER.COMMIT_TIMESTAMP 列に保存されるときにナノ秒に変換されます。
キーとインデックス
commit タイムスタンプ列は、主キー列または主キー以外の列として使用できます。主キーは ASC または DESC で定義します。
ASC(デフォルト)- キーを昇順にすると、特定の時間以降を照会する場合に便利です。DESC- キーを降順にすると、最終行がテーブルの先頭になります。これにより、最新のレコードにすばやくアクセスできます。
ホットスポットを回避する
次のシナリオで commit タイムスタンプを使用すると、データのパフォーマンスが低下するホットスポットが作成されます。
テーブルの主キーの先頭部分として commit タイムスタンプ列を使う。
CREATE TABLE Users ( LastAccess SPANNER.COMMIT_TIMESTAMP NOT NULL, UserId bigint NOT NULL, ... PRIMARY KEY (LastAccess, UserId) ) ;commit タイムスタンプの主キー列をセカンダリ インデックスの先頭部分として使う。
CREATE INDEX UsersByLastAccess ON Users(LastAccess)または
CREATE INDEX UsersByLastAccessAndName ON Users(LastAccess, FirstName)
ホットスポットは、書き込み率が低い場合でもデータのパフォーマンスを低下させます。インデックスが作成されていないキー以外の列に commit タイムスタンプを有効にする場合は、パフォーマンスのオーバーヘッドは発生しません。
既存のテーブルに commit タイムスタンプ列を追加する
commit タイムスタンプ列を既存のテーブルに追加するには、ALTER TABLE ステートメントを使用します。たとえば、Performances テーブルに LastUpdateTime 列を追加するには、次のステートメントを使用します。
ALTER TABLE Performances ADD COLUMN LastUpdateTime SPANNER.COMMIT_TIMESTAMP;
DML ステートメントを使用した commit タイムスタンプの作成
DML ステートメントで commit タイムスタンプを作成するには、SPANNER.PENDING_COMMIT_TIMESTAMP() 関数を使用します。トランザクションが commit されると、Spanner が commit タイムスタンプを選択します。
次の DML ステートメントは、commit タイムスタンプで Performances テーブルの LastUpdateTime 列を更新します。
UPDATE Performances SET LastUpdateTime = SPANNER.PENDING_COMMIT_TIMESTAMP()
WHERE SingerId=1 AND VenueId=2 AND EventDate="2015-10-21"
ミューテーションを使用して行を挿入する
行の挿入時に Spanner が commit タイムスタンプ値を書き込むようにするには、列リストに列を指定し、値として spanner.commit_timestamp() プレースホルダ文字列(またはクライアント ライブラリ定数)を渡す必要があります。例:
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
複数のテーブルの行に変異がある場合は、各テーブルの commit タイムスタンプ列に spanner.commit_timestamp()(またはクライアント ライブラリ定数)を指定する必要があります。
ミューテーションを使用して行を更新する
行の更新時に Spanner が commit タイムスタンプ値を書き込むようにするには、列リストに列を指定し、値として spanner.commit_timestamp() プレースホルダ文字列(またはクライアント ライブラリ定数)を渡す必要があります。行の主キーは更新できません。主キーを更新するには、既存の行を削除して新しい行を作成します。
たとえば、LastUpdateTime という名前の commit タイムスタンプ列を更新するには、次のようにします。
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
複数のテーブルの行にミューテーションがある場合は、各テーブルの commit タイムスタンプ列に spanner.commit_timestamp()(またはクライアント ライブラリ定数)を指定する必要があります。
commit タイムスタンプ列をクエリする
次の例では、テーブルの commit タイムスタンプ列をクエリで取得します。