ClickHouse テーブルから古いレコードを削除することは可能ですか?
簡潔に言えば「はい」です。ClickHouse には、古いデータを削除してディスク容量を解放するための複数の仕組みがあります。それぞれ異なるシナリオに対応しています。
TTL
ClickHouse では、特定の条件が満たされたときに値を自動的に削除できます。この条件は任意のカラム(通常はタイムスタンプカラムに対する静的なオフセット)に基づく式として設定します。
このアプローチの主な利点は、TTL を一度設定すれば外部システムからのトリガーを必要とせず、データの削除がバックグラウンドで自動的に行われることです。
TTL は、データを /dev/null に移動するだけでなく、SSD から HDD など、異なるストレージシステム間でデータを移動するためにも使用できます。
詳細は、TTL の設定を参照してください。
DELETE FROM
DELETE FROM を使用すると、ClickHouse で標準的な DELETE クエリを実行できます。フィルター句で対象となった行は削除済みとしてマークされ、今後の結果セットには含まれません。行のクリーンアップは非同期に行われます。
DELETE FROM はバージョン 23.3 以降で一般提供されています。それ以前のバージョンでは実験的機能であり、次の設定で有効にする必要があります。
ALTER DELETE
ALTER DELETE は、非同期バッチ処理を使用して行を削除します。DELETE FROM と異なり、ALTER DELETE の実行後からバッチ処理の完了までの間に実行されたクエリには、削除対象の行も含まれたままになります。詳細については ALTER DELETE のドキュメントを参照してください。
ALTER DELETE は、古いデータを柔軟に削除するために発行できます。これを定期的に行う必要がある場合の主な欠点は、クエリを定期的に送信する外部システムが必要になることです。また、削除する行が 1 行だけであっても mutation はパーツ全体を書き換えるため、パフォーマンス面での考慮も必要です。
これは、ClickHouse ベースのシステムを GDPR に準拠させるために最も一般的に用いられる手法です。
mutation の詳細についてはこちらを参照してください。
DROP PARTITION
ALTER TABLE ... DROP PARTITION は、パーティション全体を削除するためのコスト効率の高い方法です。柔軟性はそれほど高くなく、テーブル作成時に適切なパーティション方式を設定しておく必要がありますが、一般的なケースのほとんどはカバーできます。通常運用では、ミューテーションと同様に外部システムから実行する必要があります。
パーティションの操作の詳細を参照してください。
TRUNCATE
テーブルからすべてのデータを削除するのはかなり極端な操作ですが、状況によってはまさにそれが必要になる場合もあります。
詳細については、テーブルの TRUNCATE を参照してください。