オンザフライミューテーション
SELECT クエリでは変更後の値が自動的に返されます。オンザフライミューテーションが有効でない場合、変更後の値を確認できるようになるまで、バックグラウンドプロセスによってミューテーションが適用されるのを待つ必要があることがあります。
オンザフライミューテーションは、クエリレベルの設定 apply_mutations_on_fly を有効にすることで、MergeTree ファミリーのテーブルで使用できます。
例
SELECTクエリで更新後の結果を確認してみましょう:
SELECT クエリでは、ミューテーションの適用を待たなくても、すぐに正しい結果が返るようになりました:
パフォーマンスへの影響
SELECT クエリの実行時にのみ適用されます。ただし、ミューテーションの実体化自体は引き続きバックグラウンドで非同期に行われており、これは負荷の高い処理である点に注意してください。
一定の時間間隔において、投入されるミューテーション数がバックグラウンドで処理されるミューテーション数を継続的に上回ると、適用待ちの未実体化ミューテーションのキューは増え続けます。その結果、最終的に SELECT クエリのパフォーマンスが低下します。
未実体化ミューテーションが無制限に増え続けるのを抑えるため、設定 apply_mutations_on_fly は、number_of_mutations_to_throw や number_of_mutations_to_delay などの MergeTree レベルのほかの設定と併せて有効にすることを推奨します。
サブクエリと非決定論的関数のサポート
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) 。