ALTER TABLE クエリでは、テーブル設定またはデータを変更します。
ほとんどの
ALTER TABLE クエリは、*MergeTree、Merge、および Distributed テーブルでのみサポートされています。ALTER ステートメントはビューを操作します。
| ステートメント | 説明 |
|---|---|
| ALTER TABLE … MODIFY QUERY | materialized view の構造を変更します。 |
ALTER ステートメントは、ロールベースのアクセス制御に関連するエンティティを変更します。
| ステートメント | 説明 |
|---|---|
| ALTER TABLE … MODIFY COMMENT | 事前に設定されていたかどうかにかかわらず、テーブルのコメントを追加、変更、または削除します。 |
| ALTER NAMED COLLECTION | Named Collections を変更します。 |
ミューテーション
ALTER クエリは、「ミューテーション」と呼ばれる仕組みによって実装されています。代表的なものとして、ALTER TABLE … DELETE や ALTER TABLE … UPDATE があります。これらは、MergeTree テーブルにおけるマージと同様、新しい「変更後」のパーツを生成する非同期のバックグラウンド処理です。
*MergeTree テーブルでは、ミューテーションはデータパーツ全体を書き換えることで実行されます。
アトミック性はありません。パーツは準備ができ次第、変更後のパーツに置き換えられるため、ミューテーションの実行中に開始された SELECT クエリでは、すでに変更済みのパーツのデータと、まだ変更されていないパーツのデータの両方が見えることがあります。
ミューテーションは作成順に完全に順序付けられ、その順序で各パーツに適用されます。また、INSERT INTO クエリに対しては部分的な順序関係もあります。ミューテーションの送信前にテーブルへ挿入されたデータは変更対象になりますが、その後に挿入されたデータは変更されません。なお、ミューテーションが insert をブロックすることはありません。
ミューテーションのクエリは、ミューテーションエントリが追加されるとすぐに返ります (レプリケートテーブルの場合は ZooKeeper に、非レプリケートテーブルの場合は filesystem に追加されます) 。ミューテーション自体は、システムの profile 設定を使用して非同期に実行されます。ミューテーションの進行状況を追跡するには、system.mutations テーブルを使用できます。正常に送信されたミューテーションは、ClickHouse server が再起動しても実行が継続されます。いったん送信されたミューテーションをロールバックする方法はありませんが、何らかの理由で停止している場合は、KILL MUTATION クエリでキャンセルできます。
完了したミューテーションのエントリはすぐには削除されません (保持するエントリ数は、ストレージエンジンのパラメータ finished_mutations_to_keep で決まります) 。古いミューテーションエントリは削除されます。
ALTERクエリの同期
ALTER クエリが同期的に実行されます。レプリケートテーブルでは、クエリは対応する操作の指示を ZooKeeper に追加するだけで、操作自体はできるだけ早く実行されます。ただし、クエリはそれらの操作がすべてのレプリカで完了するまで待機できます。
ミューテーションを作成する ALTER クエリ (例: UPDATE、DELETE、MATERIALIZE INDEX、MATERIALIZE PROJECTION、MATERIALIZE COLUMN、APPLY DELETED MASK、APPLY PATCHES、CLEAR STATISTIC、MATERIALIZE STATISTIC など) については、同期性は mutations_sync 設定によって決まります。
メタデータのみを変更するその他の ALTER クエリについては、alter_sync 設定を使用して待機方法を設定できます。
非アクティブなレプリカがすべての ALTER クエリを実行するまで、どれだけ長く (秒単位で) 待機するかは、replication_wait_for_inactive_replica_timeout 設定で指定できます。
すべての
ALTER クエリについて、alter_sync = 2 であり、かつ一部のレプリカが replication_wait_for_inactive_replica_timeout 設定で指定された時間を超えて非アクティブな場合は、UNFINISHED 例外がスローされます。- ブログ: ClickHouseでの更新と削除の処理