軽量更新
Lightweight Update
軽量更新が有効になると、更新された行はすぐに更新されたとしてマークされ、その後の SELECT
クエリは自動的に変更された値を返します。軽量更新が無効の場合、変更された値を見るためには、バックグラウンドプロセスを介して変更が適用されるのを待つ必要があります。
軽量更新は、クエリレベルの設定 apply_mutations_on_fly
を有効にすることで、 MergeTree
系のテーブルに対して有効にすることができます。
Example
テーブルを作成し、いくつかの変更を実行してみましょう:
SELECT
クエリを介して更新の結果を確認してみましょう:
新しいテーブルをクエリしたときに、行の値はまだ更新されていないことに注意してください:
次に、軽量更新を有効にしたときに何が起こるか見てみましょう:
SELECT
クエリは、変更が適用されるのを待たずに即座に正しい結果を返します:
Performance Impact
軽量更新が有効な場合、変更はすぐにはマテリアライズされず、 SELECT
クエリの実行中のみ適用されます。ただし、バックグラウンドで非同期的に変更がマテリアライズされることに注意してください。これは重いプロセスです。
提出された変更の数が、一定の時間間隔でバックグラウンドで処理される変更の数を常に超える場合、適用する必要がある未マテリアライズの変更のキューは増大し続けます。これにより、 SELECT
クエリのパフォーマンスが最終的に低下します。
無限に成長する未マテリアライズの変更を制限するために、 apply_mutations_on_fly
設定を number_of_mutations_to_throw
や number_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)。