mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-12-15 10:52:30 +00:00
72 lines
5.6 KiB
Markdown
72 lines
5.6 KiB
Markdown
---
|
||
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)
|