削除操作の概要
Apache Doris には、条件付き削除、パーティション単位の削除、テーブル全体のデータ削除、主キーによる一括削除、アトミックな上書きなど、さまざまな用途に対応する削除方法があります。このページでは、利用シーンに応じて適切な方法を選べるように説明します。
方法の選び方
利用シーンに応じて、次の削除方法を選択してください。
| 利用シーン | 推奨方法 | 対象モデル | 特徴 |
|---|---|---|---|
| 条件を指定してデータの一部を削除する | DELETE 文 | すべてのテーブルモデル | 汎用的で柔軟 |
| 期限切れのパーティションを削除する(例:直近 7 日分だけを残す) | パーティション削除(TRUNCATE) | パーティション分割されたテーブル | メタデータのみを変更するため、最も効率的 |
| スキーマを維持したままテーブル全体を空にする | テーブル全体の削除(TRUNCATE) | すべてのテーブルモデル | データをすばやく初期化 |
| 大量の主キーを一括削除する(CDC 同期など) | 削除フラグ(Delete Sign) | Unique Key モデル | 更新によって一括削除を実現 |
| クエリを中断せずにパーティションデータを書き換える | 一時パーティションによるアトミックな置換 | パーティション分割されたテーブル | アトミックに上書きし、クエリできない期間を防ぐ |
削除方法の詳細
1. DELETE 文:条件付き削除
条件を指定してデータの一部を削除する一般的な用途に適しており、すべてのテーブルモデルに対応します。
構文:
DELETE FROM table_name WHERE condition;
適用時の注意点:
- 日常的な削除のほとんどに対応できます。
- 一括削除やパーティション全体の削除では、以下の方法より効率が低くなります。
詳しい使い方は、DELETE 操作を参照してください。
2. パーティション削除:期限切れデータの効率的な整理
Doris では、日付ごとにパーティションを分けてデータを管理するのが一般的です。直近の期間のデータだけを残す場合(例:直近 7 日分)は、パーティション削除(パーティションの TRUNCATE)を推奨します。
構文:
TRUNCATE TABLE tbl PARTITION(p1, p2);
利点:
- パーティションのメタデータのみを変更し、データのスキャンは不要です。
- 期限切れのパーティションを整理するためのベストプラクティスです。
詳しい使い方は、TRUNCATE 操作を参照してください。
3. テーブル全体の削除:テーブルをすばやく空にする
オフライン分析のデータを再作成する場合など、スキーマを維持したままテーブル全体をすばやく空にする用途に適しています。
構文:
TRUNCATE TABLE table_name;
詳しい使い方は、TRUNCATE 操作を参照してください。
4. 削除フラグ:主キーの一括削除
データの削除は、データ更新の特殊な形と見なすことができます。更新に対応する主キーモデル(Unique Key)では、削除フラグを使い、更新書き込みによってデータを削除できます。
代表的な利用シーン:
- CDC(Change Data Capture)によるデータ同期:DELETE 操作の binlog に削除フラグを付けて Doris に書き込み、対応する主キーのデータを削除します。
利点と制約:
- 主キーによる一括削除に対応し、DELETE 文より効率的です。
- 高度な機能であり、使用方法は比較的複雑です。
詳しい使い方は、一括削除を参照してください。
5. 一時パーティションによるアトミックな置換:クエリを中断せずに上書きする
パーティションのデータを書き換えるときに「先に削除してからロードする」方法を直接使うと、データをクエリできない期間が生じます。一時パーティションによるアトミックな置換を使えば、この問題を回避できます。
手順:
- 対象パーティションに対応する一時パーティションを作成します。
- 新しいデータを一時パーティションにロードします。
- 置換操作によって元のパーティションをアトミックに置き換えます。
詳しい使い方は、一時パーティションを参照してください。テーブル全体をアトミックに置き換える場合は、テーブルのアトミックな置換を参照してください。
削除方法の比較
| 方法 | 構文のキーワード | 削除単位 | 性能 | すべてのテーブルモデルに対応 |
|---|---|---|---|---|
| DELETE 文 | DELETE FROM | 条件に一致するデータ | 中 | はい |
| パーティション削除 | TRUNCATE PARTITION | パーティション全体 | 高(メタデータのみ) | パーティション分割されたテーブルのみ |
| テーブル全体の削除 | TRUNCATE TABLE | テーブル全体 | 高 | はい |
| 削除フラグ | __DORIS_DELETE_SIGN__ を書き込む | 主キー単位 | 高(一括処理) | Unique Key モデルのみ |
| 一時パーティションによるアトミックな置換 | REPLACE PARTITION | パーティション全体 | 高 | パーティション分割されたテーブルのみ |
注意事項
- バージョン数への影響:削除操作によって新しいデータバージョンが生成されます。削除を頻繁に行うとバージョン数が増え、クエリ性能に影響する可能性があります。
- ストレージ領域の解放までの遅延:削除したデータは Compaction が完了するまでストレージ領域を占有します。削除操作だけでは、ストレージ使用量はすぐには減りません。
- テーブルモデルの制約:削除フラグは主キーを持つ Unique Key モデルにのみ適用できます。パーティションに関する削除は、パーティション分割されたテーブルにのみ適用できます。
よくある質問(FAQ)
Q1:DELETE 文と TRUNCATE の違いは何ですか?
DELETE 文は WHERE 条件に基づいてデータを削除し、どのテーブルでも使用できます。TRUNCATE はメタデータのみを変更してテーブル全体またはパーティション全体を直接削除します。処理は速い一方、削除単位は大きくなります。
Q2:削除後すぐにストレージ領域が解放されないのはなぜですか?
削除後のデータがストレージから実際に除去されるのは、バックグラウンドでの Compaction によるマージが完了してからです。これは通常の動作です。
Q3:CDC 同期で発生する DELETE イベントを効率的に処理するにはどうすればよいですか?
Unique Key 主キーモデルと削除フラグを組み合わせる方法を推奨します。大量の主キーを一括削除でき、DELETE 文を個別に実行するより大幅に効率的です。
Q4:パーティションデータの書き換え中もクエリを中断させない方法はありますか?
一時パーティションによるアトミックな置換を使用します。まず新しいデータを一時パーティションに書き込み、次にアトミックな置換操作でパーティションを切り替えます。この処理全体はクエリに対して透過的です。