ALTER
ほとんどの ALTER TABLE クエリは、テーブルの設定やデータを変更します:
| 修飾子 |
|---|
| COLUMN |
| PARTITION |
| DELETE |
| UPDATE |
| ORDER BY |
| INDEX |
| CONSTRAINT |
| TTL |
| STATISTICS |
| APPLY DELETED MASK |
ほとんどの ALTER TABLE クエリは、*MergeTree、Merge、および Distributed テーブルのみでサポートされています。
これらの ALTER ステートメントはビューを操作します:
| ステートメント | 説明 |
|---|---|
| ALTER TABLE ... MODIFY QUERY | Materialized view 構造を変更します。 |
| ALTER LIVE VIEW | Live view を更新します。 |
これらの ALTER ステートメントは、ロールベースのアクセス制御に関連するエンティティを修正します:
| ステートメント |
|---|
| USER |
| ROLE |
| QUOTA |
| ROW POLICY |
| SETTINGS PROFILE |
| ステートメント | 説明 |
|---|---|
| ALTER TABLE ... MODIFY COMMENT | テーブルへのコメントを追加、修正、または削除します。以前に設定されているかどうかに関係なく。 |
| ALTER NAMED COLLECTION | Named Collections を修正します。 |
Mutations
テーブルデータを操作することを目的とした ALTER クエリは「ミューテーション」と呼ばれるメカニズムを使用して実装されています。特に ALTER TABLE ... DELETE と ALTER TABLE ... UPDATE がこれに該当します。これらは、MergeTree テーブルのマージに類似した非同期のバックグラウンドプロセスで、新しい「変異」バージョンのパーツを生成します。
*MergeTree テーブルのミューテーションは データパーツ全体を書き換える ことによって実行されます。原子的ではなく、パーツは準備ができ次第変異パーツに置き換えられ、ミューテーション中に実行を開始した SELECT クエリは、すでに変異されたパーツのデータと、まだ変異していないパーツのデータを一緒に見ることになります。
ミューテーションは作成順に完全に順序付けされ、その順序で各パーツに適用されます。ミューテーションは INSERT INTO クエリとも部分的に順序付けがされており、ミューテーションが送信される前にテーブルに挿入されたデータは変異されますが、その後に挿入されたデータは変異されません。ミューテーションは挿入を何らかの方法でブロックすることはありません。
ミューテーションクエリは、ミューテーションエントリが追加され次第すぐに戻ります(レプリケートテーブルの場合は ZooKeeper に、非レプリケートテーブルの場合はファイルシステムに)。ミューテーション自体はシステムプロファイル設定を使用して非同期に実行されます。ミューテーションの進捗を追跡するには、system.mutations テーブルを使用できます。成功裏に送信されたミューテーションは、ClickHouse サーバーが再起動されても実行を続けます。ミューテーションが送信された後はロールバックする方法はありませんが、何らかの理由でミューテーションがスタックした場合は、KILL MUTATION クエリでキャンセルすることができます。
完了したミューテーションのエントリはすぐには削除されません(保持されるエントリの数は finished_mutations_to_keep ストレージエンジンパラメータによって決定されます)。古いミューテーションエントリは削除されます。
Synchronicity of ALTER Queries
非レプリケートテーブルの場合、すべての ALTER クエリは同期的に実行されます。レプリケートテーブルの場合、クエリは ZooKeeper に適切なアクションの指示を追加し、アクションは可能な限り迅速に実行されます。しかし、クエリはこれらのアクションがすべてのレプリカで完了するのを待つことができます。
ミューテーションを作成する ALTER クエリ(例えば UPDATE、DELETE、MATERIALIZE INDEX、MATERIALIZE PROJECTION、MATERIALIZE COLUMN、APPLY DELETED MASK、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 がスローされます。
Related content
- Blog: ClickHouseでの更新と削除の取り扱い