削除の概要
ClickHouseでデータを削除する方法はいくつかあり、それぞれに利点とパフォーマンス特性があります。データモデルや削除するデータの量に基づいて適切な方法を選択する必要があります。
方法 | 構文 | 使用するタイミング |
---|---|---|
論理削除 | DELETE FROM [table] | データ量が少ない場合に使用します。行はすぐにすべての後続の SELECT クエリからフィルタリングされますが、最初は内部で削除されたとしてマークされるだけで、ディスクからは削除されません。 |
削除ミューテーション | ALTER TABLE [table] DELETE | データをディスクからすぐに削除する必要がある場合に使用します(例:コンプライアンスのため)。SELECTパフォーマンスに悪影響を与えます。 |
テーブルのトランケート | TRUNCATE TABLE [db.table] | テーブルからすべてのデータを効率的に削除します。 |
パーティションのドロップ | 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
パフォーマンスに影響を与える可能性があるため、使用は控えめにすべきです。
削除ミューテーションについて詳しく読む。
テーブルのトランケート
テーブル内のすべてのデータを削除する必要がある場合は、以下の TRUNCATE TABLE
コマンドを使用してください。これは軽量の操作です。
TRUNCATE TABLEについて詳しく読む。
パーティションのドロップ
データのカスタムパーティショニングキーを指定している場合、パーティションを効率的に削除できます。高いカーディナリティのパーティショニングは避けてください。
DROP PARTITIONについて詳しく読む。