データ操作言語のベスト プラクティス

このページでは、データ操作言語(DML)とパーティション化 DML を使用するベスト プラクティスについて説明します。

ロックされる行数を減らすには WHERE 句を使用する

DML ステートメントを読み取り / 書き込みトランザクション内で実行します。Cloud Spanner は、読み込んだすべての行(WHERE 句のフィルタ条件と一致しない行も含む)の共有読み取りロックを取得します。Cloud Spanner は、変更する行に対して排他ロックを取得します。このため、トランザクションが読み取った行の一部しか変更しない場合でも、Cloud Spanner が非常に多くの行またはテーブル全体のロックを取得することがあります。ロックされる行数を減らすには、WHERE 句に主キーの列を含め、UPDATE ステートメントと DELETE ステートメントの WHERE 句の範囲を小さくします。

同じトランザクション内で DML ステートメントとミューテーションを使用しない

Cloud Spanner は、サーバー側で DML ステートメントを使用して実行された挿入、更新、削除をバッファに保存します。この結果は、同じトランザクション内の後続の SQL ステートメントと DML ステートメントで参照できます。この動作は Mutation API とは異なります。Cloud Spanner は、クライアント側でミューテーションをバッファに保存し、commit オペレーションでサーバー側にミューテーションを送信します。このため、commit リクエストのミューテーションは、同じトランザクション内の SQL ステートメントまたは DML ステートメントで参照できません。

一部のオペレーションは Mutation API でのみサポートされているため、insert_or_update のように、同じトランザクションで DML ステートメントとミューテーションを組み合わせることができます。commit リクエストでトランザクションに DML ステートメントとミューテーションの両方が含まれている場合、Cloud Spanner はミューテーションの前に DML ステートメントを実行します。クライアント ライブラリ コードの実行順序を考慮する必要がないようにするには、1 つのトランザクション内に DML ステートメントまたはミューテーションのいずれかを使用します。両方を使用する必要はありません。両方を使用する場合は、トランザクションの最後で書き込みをバッファに保存します。

commit タイムスタンプを書き込むには PENDING_COMMIT_TIMESTAMP 関数を使用する

DML ステートメントで commit タイムスタンプを作成するには、PENDING_COMMIT_TIMESTAMP 関数を使用します。トランザクションが commit されると、Cloud Spanner が commit タイムスタンプを選択します。

パーティション化 DML と日付 / タイムスタンプ関数

パーティション化 DML は 1 つ以上のトランザクションを使用します。これらのトランザクションは異なる時間に実行され、commit される可能性があります。日付関数またはタイムスタンプ関数を使用すると、変更した行に異なる値が格納される可能性があります。

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Cloud Spanner のドキュメント