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

削除の概要

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について詳しく読む。

追加リソース