即時変異
On-the-fly mutations
オンザフライの変更が有効になっている時、更新された行はすぐに更新済みとしてマークされ、その後の SELECT
クエリは自動的に変更された値を返します。オンザフライの変更が有効でない場合、変更された値を見るにはバックグラウンドプロセスを通じて変更が適用されるのを待つ必要があるかもしれません。
オンザフライの変更は、クエリレベルの設定 apply_mutations_on_fly
を有効にすることで MergeTree
系のテーブルに対して有効にできます。
Example
テーブルを作成し、いくつかの変更を実行してみましょう:
更新の結果を SELECT
クエリで確認してみましょう:
新しいテーブルをクエリする際に行の値がまだ更新されていないことに注意してください:
オンザフライの変更を有効にすると、何が起こるか見てみましょう:
SELECT
クエリは今すぐ正しい結果を返し、変更が適用されるのを待つ必要がなくなります:
Performance impact
オンザフライの変更が有効になっている場合、変更はすぐには具現化されず、SELECT
クエリの際にのみ適用されます。ただし、変更はバックグラウンドで非同期に具現化され続けており、これは重いプロセスです。
提出された変更の数が、一定の時間間隔内でバックグラウンドで処理される変更の数を常に超える場合、適用されるのを待つ未具現化の変更のキューが増え続けます。これにより最終的には SELECT
クエリのパフォーマンスが劣化することになります。
未具現化の変更が無限に増え続けないように、設定 apply_mutations_on_fly
を MergeTree
レベルの他の設定(例:number_of_mutations_to_throw
や number_of_mutations_to_delay
)と一緒に有効にすることをお勧めします。
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)。