メインコンテンツまでスキップ
メインコンテンツまでスキップ

ALTER

ほとんどの ALTER TABLE クエリは、テーブルの設定やデータを変更します:

修飾子
COLUMN
PARTITION
DELETE
UPDATE
ORDER BY
INDEX
CONSTRAINT
TTL
STATISTICS
APPLY DELETED MASK
注記

ほとんどの ALTER TABLE クエリは、*MergeTreeMerge、および Distributed テーブルのみでサポートされています。

これらの ALTER ステートメントはビューを操作します:

ステートメント説明
ALTER TABLE ... MODIFY QUERYMaterialized view 構造を変更します。
ALTER LIVE VIEWLive view を更新します。

これらの ALTER ステートメントは、ロールベースのアクセス制御に関連するエンティティを修正します:

ステートメント
USER
ROLE
QUOTA
ROW POLICY
SETTINGS PROFILE
ステートメント説明
ALTER TABLE ... MODIFY COMMENTテーブルへのコメントを追加、修正、または削除します。以前に設定されているかどうかに関係なく。
ALTER NAMED COLLECTIONNamed Collections を修正します。

Mutations

テーブルデータを操作することを目的とした ALTER クエリは「ミューテーション」と呼ばれるメカニズムを使用して実装されています。特に ALTER TABLE ... DELETEALTER TABLE ... UPDATE がこれに該当します。これらは、MergeTree テーブルのマージに類似した非同期のバックグラウンドプロセスで、新しい「変異」バージョンのパーツを生成します。

*MergeTree テーブルのミューテーションは データパーツ全体を書き換える ことによって実行されます。原子的ではなく、パーツは準備ができ次第変異パーツに置き換えられ、ミューテーション中に実行を開始した SELECT クエリは、すでに変異されたパーツのデータと、まだ変異していないパーツのデータを一緒に見ることになります。

ミューテーションは作成順に完全に順序付けされ、その順序で各パーツに適用されます。ミューテーションは INSERT INTO クエリとも部分的に順序付けがされており、ミューテーションが送信される前にテーブルに挿入されたデータは変異されますが、その後に挿入されたデータは変異されません。ミューテーションは挿入を何らかの方法でブロックすることはありません。

ミューテーションクエリは、ミューテーションエントリが追加され次第すぐに戻ります(レプリケートテーブルの場合は ZooKeeper に、非レプリケートテーブルの場合はファイルシステムに)。ミューテーション自体はシステムプロファイル設定を使用して非同期に実行されます。ミューテーションの進捗を追跡するには、system.mutations テーブルを使用できます。成功裏に送信されたミューテーションは、ClickHouse サーバーが再起動されても実行を続けます。ミューテーションが送信された後はロールバックする方法はありませんが、何らかの理由でミューテーションがスタックした場合は、KILL MUTATION クエリでキャンセルすることができます。

完了したミューテーションのエントリはすぐには削除されません(保持されるエントリの数は finished_mutations_to_keep ストレージエンジンパラメータによって決定されます)。古いミューテーションエントリは削除されます。

Synchronicity of ALTER Queries

非レプリケートテーブルの場合、すべての ALTER クエリは同期的に実行されます。レプリケートテーブルの場合、クエリは ZooKeeper に適切なアクションの指示を追加し、アクションは可能な限り迅速に実行されます。しかし、クエリはこれらのアクションがすべてのレプリカで完了するのを待つことができます。

ミューテーションを作成する ALTER クエリ(例えば UPDATEDELETEMATERIALIZE INDEXMATERIALIZE PROJECTIONMATERIALIZE COLUMNAPPLY DELETED MASKCLEAR STATISTICMATERIALIZE STATISTIC など)については、同期性は mutations_sync 設定によって定義されます。

メタデータのみを変更する他の ALTER クエリについては、alter_sync 設定を使用して待機を設定できます。

アクティブでないレプリカがすべての ALTER クエリを実行するのを待つ時間(秒数)を replication_wait_for_inactive_replica_timeout 設定で指定できます。

注記

すべての ALTER クエリについて、alter_sync = 2 であり、いくつかのレプリカが replication_wait_for_inactive_replica_timeout 設定で指定された時間以上にアクティブでない場合、例外 UNFINISHED がスローされます。