メインコンテンツまでスキップ
メインコンテンツまでスキップ

軽量更新

Lightweight Update

軽量更新が有効になると、更新された行はすぐに更新されたとしてマークされ、その後の SELECT クエリは自動的に変更された値を返します。軽量更新が無効の場合、変更された値を見るためには、バックグラウンドプロセスを介して変更が適用されるのを待つ必要があります。

軽量更新は、クエリレベルの設定 apply_mutations_on_fly を有効にすることで、 MergeTree 系のテーブルに対して有効にすることができます。

Example

テーブルを作成し、いくつかの変更を実行してみましょう:

SELECT クエリを介して更新の結果を確認してみましょう:

新しいテーブルをクエリしたときに、行の値はまだ更新されていないことに注意してください:

次に、軽量更新を有効にしたときに何が起こるか見てみましょう:

SELECT クエリは、変更が適用されるのを待たずに即座に正しい結果を返します:

Performance Impact

軽量更新が有効な場合、変更はすぐにはマテリアライズされず、 SELECT クエリの実行中のみ適用されます。ただし、バックグラウンドで非同期的に変更がマテリアライズされることに注意してください。これは重いプロセスです。

提出された変更の数が、一定の時間間隔でバックグラウンドで処理される変更の数を常に超える場合、適用する必要がある未マテリアライズの変更のキューは増大し続けます。これにより、 SELECT クエリのパフォーマンスが最終的に低下します。

無限に成長する未マテリアライズの変更を制限するために、 apply_mutations_on_fly 設定を number_of_mutations_to_thrownumber_of_mutations_to_delay などの他の MergeTree レベルの設定とともに有効にすることをお勧めします。

Support for subqueries and non-deterministic functions

軽量更新は、サブクエリや非決定的関数に対するサポートが限られています。結果が合理的なサイズのスカラサブクエリのみ(設定 mutations_max_literal_size_to_replace によって制御される)がサポートされています。定数の非決定的関数のみがサポートされています(例:関数 now())。

これらの動作は次の設定によって制御されます:

  • mutations_execute_nondeterministic_on_initiator - true の場合、非決定的関数はイニシエーターのレプリカで実行され、UPDATE および DELETE クエリ内でリテラルとして置き換えられます。デフォルト値:false
  • mutations_execute_subqueries_on_initiator - true の場合、スカラサブクエリはイニシエーターのレプリカで実行され、UPDATE および DELETE クエリ内でリテラルとして置き換えられます。デフォルト値:false
  • mutations_max_literal_size_to_replace - UPDATE および DELETE クエリで置き換えるシリアル化されたリテラルの最大サイズ(バイト)。デフォルト値:16384 (16 KiB)。