削除の概要
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についてさらに読む。
パーティションの削除
データにカスタムのパーティショニングキーを指定している場合、パーティションを効率的に削除できます。高いカーディナリティのパーティショニングは避けてください。
DROPPARTITIONについてさらに読む。