削除の概要
ClickHouse でデータを削除する方法はいくつかあり、それぞれ長所とパフォーマンス特性が異なります。データモデルと削除するデータ量に応じて、適切な方法を選択してください。
| Method | Syntax | When to use |
|---|---|---|
| Lightweight delete | DELETE FROM [table] | 少量のデータを削除する場合に使用します。行は以降のすべての SELECT クエリから即座に除外されますが、当初は内部的に削除済みとしてマークされるだけであり、ディスク上からは削除されません。 |
| Delete mutation | ALTER TABLE [table] DELETE | データをすぐにディスクから削除する必要がある場合(コンプライアンス要件など)に使用します。SELECT のパフォーマンスに悪影響を与えます。 |
| Truncate table | TRUNCATE TABLE [db.table] | テーブルからすべてのデータを効率的に削除します。 |
| Drop partition | DROP PARTITION | パーティション内のすべてのデータを効率的に削除します。 |
以下は、ClickHouse でデータを削除するさまざまな方法の概要です。
軽量削除
軽量削除では、行は即座に削除済みとしてマークされ、その後のすべての SELECT クエリから自動的にフィルタリングされます。これらの削除済み行の物理的な削除は、その後の通常のマージサイクル中に実行されるため、I/O 負荷が小さくなります。その結果、しばらくの間はデータがストレージから実際には削除されず、削除済みとしてマークされているだけの場合があります。データが確実に削除されていることを保証する必要がある場合は、上記のミューテーションコマンドの使用を検討してください。
軽量な DELETE ステートメントで大量のデータを削除すると、SELECT クエリのパフォーマンスに悪影響を与える可能性があります。また、このコマンドはプロジェクションを持つテーブルとは互換性がありません。
削除された行をマークする操作(_row_exists 列の追加)にはミューテーションが使用されるため、一定の I/O が発生する点に注意してください。
一般に、削除済みデータがディスク上に存在し続けることを許容できる場合(たとえばコンプライアンス順守が必須ではないケースなど)は、ミューテーションよりも軽量削除を優先して使用すべきです。一方で、すべてのデータを削除する必要がある場合には、この方法は避けるべきです。
軽量削除の詳細については、こちらを参照してください。
削除ミューテーション
削除ミューテーションは、例えば ALTER TABLE ... DELETE コマンドで実行できます。
これらは同期的(非レプリケートテーブルの場合はデフォルト)または非同期的(mutations_sync 設定によって決定)に実行できます。これらの処理は非常に I/O 負荷が高く、WHERE 句に一致するすべてのパーツを書き換えます。この処理にはアトミック性はありません。パーツはミューテーション後のパーツが準備でき次第順次置き換えられ、ミューテーションの実行中に開始された SELECT クエリは、すでにミューテーション済みのパーツと、まだミューテーションされていないパーツの両方からのデータを参照することになります。ユーザーは systems.mutations テーブルを通じて進捗状況を追跡できます。これらは I/O 負荷の高い操作であり、クラスタの SELECT パフォーマンスに影響を与える可能性があるため、利用は必要最小限に留める必要があります。
delete mutations の詳細を参照してください。
テーブルを空にする
テーブル内のすべてのデータを削除する必要がある場合は、以下の TRUNCATE TABLE コマンドを使用します。これは軽量な処理です。
TRUNCATE TABLE の詳細については、こちらを参照してください。
パーティションの削除
データに独自のパーティションキーを指定している場合、パーティションを効率的に削除できます。高カーディナリティなパーティション分割は避けてください。
DROP PARTITION の詳細については、こちらを参照してください。