ClickHouse/docs/ja/managing-data/deletes.md
2024-11-18 11:58:58 +09:00

72 lines
5.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
slug: /ja/deletes
title: データの削除
description: ClickHouseでデータを削除する方法
keywords: [削除, トランケート, ドロップ, 論理削除]
---
ClickHouseではデータを削除するためのいくつかの方法があり、それぞれに利点とパフォーマンス特性があります。データモデルと削除する予定のデータ量に基づいて適切な方法を選択する必要があります。
| 方法 | 構文 | 使用のタイミング |
| --- | --- | --- |
| [論理削除](/ja/guides/developer/lightweight-delete) | `DELETE FROM [table]` | 小規模なデータを削除する場合に使用します。`SELECT`クエリからすぐにフィルタリングされますが、最初は内部的に削除済みとしてマークされるだけで、ディスクからは削除されません。 |
| [物理削除](/ja/sql-reference/statements/alter/delete) | `ALTER TABLE [table] DELETE` | ディスクからすぐにデータを削除する必要がある場合に使用します(例:コンプライアンス目的)。`SELECT`のパフォーマンスに悪影響を及ぼします。 |
| [テーブルをトランケート](/ja/sql-reference/statements/truncate) | `TRUNCATE TABLE [db.table]` | テーブルからすべてのデータを効率的に削除します。 |
| [パーティションをドロップ](/ja/sql-reference/statements/alter/partition#drop-partitionpart) | `DROP PARTITION` | パーティションからすべてのデータを効率的に削除します。 |
ClickHouseでデータを削除するさまざまな方法の概要は以下の通りです。
## 論理削除
論理削除により、行は削除済みとしてマークされ、すべての後続の`SELECT`クエリから自動的にフィルタリングされます。削除された行のその後の削除は自然なマージサイクル中に行われるため、I/Oが少なくなります。そのため、未指定の期間、データは実際にはストレージから削除されず、削除としてマークされるのみです。データが確実に削除されることを保証する必要がある場合は、上記のミューテーションコマンドを検討してください。
```sql
-- ミューテーションで2018年のすべてのデータを削除します。推奨されません。
DELETE FROM posts WHERE toYear(CreationDate) = 2018
```
論理削除ステートメントを使用して大量のデータを削除すると、`SELECT`クエリのパフォーマンスに悪影響を及ぼす可能性もあります。このコマンドは、プロジェクションを持つテーブルには互換性がありません。
操作には削除された行を[マークするためのミューテーション](/ja/sql-reference/statements/delete#how-lightweight-deletes-work-internally-in-clickhouse)`_row_exists`カラムを追加に関連したI/Oが生じます。
一般に、削除されたデータがディスク上に存在することが許容される場合(非コンプライアンスケースなど)、論理削除を物理削除よりも優先するべきです。すべてのデータを削除する必要がある場合は、このアプローチは避けるべきです。
[論理削除](/ja/guides/developer/lightweight-delete)について詳しく読む。
## 物理削除
論理削除は`ALTER TABLE … DELETE`コマンドを通じて発行できます。例:
```sql
-- ミューテーションで2018年のすべてのデータを削除します。推奨されません。
ALTER TABLE posts DELETE WHERE toYear(CreationDate) = 2018
```
これらは同期的に(非レプリケートのデフォルト)、または非同期的に([mutations_sync](/ja/operations/settings/settings#mutations_sync)設定により決定)実行できます。`WHERE`式に一致するすべての部分を再書き込みするため、非常にI/Oが多くなります。このプロセスにはアトミック性がなく、部分が準備ができ次第、ミューテーションされた部分に置き換えられます。ミューテーション中に実行される`SELECT`クエリは、すでにミューテーションされた部分のデータとまだミューテーションされていない部分のデータの両方を観察します。進行状況の状態は[systems.mutations](/ja/operations/system-tables/mutations#system_tables-mutations)テーブルを通して確認できます。これらはI/Oが多い操作であり、クラスタの`SELECT`パフォーマンスに影響を与える可能性があるため、慎重に使用するべきです。
[論理削除](/ja/sql-reference/statements/alter/delete)について詳しく読む。
## テーブルをトランケート
テーブル内のすべてのデータを削除する必要がある場合は、以下の`TRUNCATE TABLE`コマンドを使用してください。これは論理な操作です。
```sql
TRUNCATE TABLE posts
```
[TRUNCATE TABLE](/ja/sql-reference/statements/truncate)について詳しく読む。
## パーティションをドロップ
データにカスタムパーティションキーを指定している場合、パーティションを効率的にドロップできます。高カーディナリティのパーティショニングは避けてください。
```sql
ALTER TABLE posts (DROP PARTITION '2008')
```
[DROP PARTITION](/ja/sql-reference/statements/alter/partition)について詳しく読む。
## その他のリソース
- [ClickHouseでのアップデートと削除の処理](https://clickhouse.com/blog/handling-updates-and-deletes-in-clickhouse)