メインコンテンツへスキップ
メインコンテンツへスキップ

ALTER

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

Modifier
COLUMN
PARTITION
DELETE
UPDATE
ORDER BY
INDEX
CONSTRAINT
TTL
STATISTICS
APPLY DELETED MASK
注記

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

次の ALTER ステートメントはビューを操作します。

StatementDescription
ALTER TABLE ... MODIFY QUERYマテリアライズドビュー の構造を変更します。

次の ALTER ステートメントは、ロールベースのアクセス制御に関連するエンティティを変更します。

Statement
USER
ROLE
QUOTA
ROW POLICY
SETTINGS PROFILE
StatementDescription
ALTER TABLE ... MODIFY COMMENTコメントがあらかじめ設定されていたかどうかに関係なく、テーブルのコメントを追加、変更、または削除します。
ALTER NAMED COLLECTIONNamed Collections を変更します。

ミューテーション

テーブルデータを変更するための ALTER クエリは、「ミューテーション」と呼ばれるメカニズムで実装されています。代表的なものは ALTER TABLE ... DELETEALTER TABLE ... UPDATE です。これらは MergeTree テーブルにおけるマージと類似した非同期のバックグラウンドプロセスで、新しい「ミューテートされた」パーツのバージョンを生成します。

*MergeTree テーブルでは、ミューテーションは データパーツ全体を書き換えることによって 実行されます。 アトミック性はなく、ミューテート済みパーツが準備でき次第、元のパーツはすぐに置き換えられます。そのため、ミューテーション実行中に開始された SELECT クエリは、すでにミューテートされたパーツのデータと、まだミューテートされていないパーツのデータの両方を見る可能性があります。

ミューテーションは作成順に完全に順序付けされ、その順序で各パーツに適用されます。また、ミューテーションと INSERT INTO クエリとの間には部分的な順序関係もあります。ミューテーションの送信前にテーブルに挿入されたデータはミューテーションの対象となり、その後に挿入されたデータはミューテーションの対象にはなりません。ミューテーションは挿入処理をいかなる形でもブロックしない点に注意してください。

ミューテーションのクエリは、ミューテーションエントリが追加されるとすぐに応答を返します(レプリケートされたテーブルの場合は ZooKeeper に、非レプリケートテーブルの場合はファイルシステムに追加されます)。ミューテーション自体はシステムプロファイル設定を用いて非同期に実行されます。ミューテーションの進行状況を追跡するには、system.mutations テーブルを使用できます。正常に送信されたミューテーションは、ClickHouse サーバーが再起動されても実行を継続します。一度送信されたミューテーションをロールバックする方法はありませんが、何らかの理由でミューテーションが停止している場合は、KILL MUTATION クエリでキャンセルできます。

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

ALTER クエリの同期性

非レプリケートテーブルに対しては、すべての 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 という例外がスローされます。