メインコンテンツまでスキップ
に最終更新

DELETE 操作

Apache Doris では、MySQL プロトコルを介して DELETE 文を実行し、条件に基づいて指定したテーブルまたはパーティションからデータを削除します。次の二つの形式を使用できます。

  • 述語による削除:単純な WHERE 述語の組み合わせに一致するデータを削除します。
  • 複数テーブルの結合による削除(USING):主キーテーブル(Unique Key)で USING 句を使用し、他のテーブルと結合してデータを削除します。

クイックナビゲーション​

用途推奨する方法対象のテーブルモデル
列の値を条件に削除する述語による削除Duplicate / Aggregate / Unique
パーティションを指定して一括削除する述語による削除と PARTITION の指定すべてのモデル
複数テーブルの結合で削除対象を特定するUSING 句による削除Unique Key のみ
削除履歴を表示するSHOW DELETEすべてのモデル

フィルター述語を指定して削除​

構文​

DELETE FROM table_name [table_alias]
[PARTITION partition_name | PARTITIONS (partition_name [, partition_name])]
WHERE column_name op { value | value_list } [ AND column_name op { value | value_list } ...];

パラメータの説明​

必須パラメータ

パラメータ説明
table_nameデータを削除する対象テーブル
column_nametable_name に属する列
op論理比較演算子。使用可能な演算子:=、>、<、>=、<=、!=、in、not in
value | value_list論理比較に使用する単一の値または値のリスト

任意パラメータ

パラメータ説明
PARTITION / PARTITIONS削除を実行するパーティション名を指定します。指定したパーティションがテーブルに存在しない場合はエラーになります
table_aliasテーブルの別名

制限事項​

  • Aggregate Key テーブル:条件に指定できるのは Key 列だけです。選択した Key 列が Rollup に存在しない場合、削除は実行できません。
  • パーティションテーブル:パーティションを指定するか、Doris が条件からパーティションを推定できる必要があります。次の二つの場合はパーティションを推定できません。
    1. 条件にパーティション列が含まれていない場合。
    2. パーティション列の op が not in の場合。
  • Unique Key 以外のパーティションテーブル:パーティションを指定せず、条件からも推定できない場合は、セッション変数 delete_without_partition = true を設定する必要があります。この場合、削除はすべてのパーティションに適用されます。

例​

例 1:指定したパーティションで、列が固定値に等しいデータを削除する

DELETE FROM my_table PARTITION p1
WHERE k1 = 3;

例 2:指定したパーティションで、複合条件を満たすデータを削除する

DELETE FROM my_table PARTITION p1
WHERE k1 >= 3 AND status = "outdated";

例 3:時間範囲で絞り込み、複数のパーティションからデータを削除する

DELETE FROM my_table PARTITIONS (p1, p2)
WHERE k1 >= 3 AND dt >= "2024-10-01" AND dt <= "2024-10-31";

USING 句を使用した削除​

削除対象のデータを複数のテーブルの結合によって正確に特定する必要がある場合は、USING 句を使用します。

構文​

DELETE FROM table_name [table_alias]
[PARTITION partition_name | PARTITIONS (partition_name [, partition_name])]
[USING additional_tables]
WHERE condition;

パラメータの説明​

必須パラメータ

パラメータ説明
table_nameデータを削除する対象テーブル
WHERE condition削除する行を選択するための条件

任意パラメータ

パラメータ説明
PARTITION / PARTITIONS削除を実行するパーティション名を指定します。指定したパーティションがテーブルに存在しない場合はエラーになります
table_aliasテーブルの別名
USING additional_tables結合に使用する他のテーブル

制限事項​

  • Unique Key モデルのテーブルでのみサポートされます。

例​

次の例では、t1 から、t2 と t3 の結合結果に基づいてデータを削除します。

ステップ 1:テーブルを作成する

CREATE TABLE t1
(id INT, c1 BIGINT, c2 STRING, c3 DOUBLE, c4 DATE)
UNIQUE KEY (id)
DISTRIBUTED BY HASH (id)
PROPERTIES('replication_num'='1', "function_column.sequence_col" = "c4");

CREATE TABLE t2
(id INT, c1 BIGINT, c2 STRING, c3 DOUBLE, c4 DATE)
DISTRIBUTED BY HASH (id)
PROPERTIES('replication_num'='1');

CREATE TABLE t3
(id INT)
DISTRIBUTED BY HASH (id)
PROPERTIES('replication_num'='1');

ステップ 2:テストデータを挿入する

INSERT INTO t1 VALUES
(1, 1, '1', 1.0, '2000-01-01'),
(2, 2, '2', 2.0, '2000-01-02'),
(3, 3, '3', 3.0, '2000-01-03');

INSERT INTO t2 VALUES
(1, 10, '10', 10.0, '2000-01-10'),
(2, 20, '20', 20.0, '2000-01-20'),
(3, 30, '30', 30.0, '2000-01-30'),
(4, 4, '4', 4.0, '2000-01-04'),
(5, 5, '5', 5.0, '2000-01-05');

INSERT INTO t3 VALUES
(1),
(4),
(5);

ステップ 3:結合を使用して削除を実行する

DELETE FROM t1
USING t2 INNER JOIN t3 ON t2.id = t3.id
WHERE t1.id = t2.id;

期待される結果:id = 1 の行が t1 から削除されます。

+----+----+----+--------+------------+
| id | c1 | c2 | c3 | c4 |
+----+----+----+--------+------------+
| 2 | 2 | 2 | 2.0 | 2000-01-02 |
| 3 | 3 | 3 | 3.0 | 2000-01-03 |
+----+----+----+--------+------------+
設定項目スコープ説明デフォルト値
insert_timeoutセッション削除は特殊なロードとして扱われ、この値によって実行時間が制限されます。SET insert_timeout = xxx で秒単位で調整します-
max_allowed_in_element_num_of_deleteグローバルIN 述語で使用できる要素数の上限1024

削除履歴の表示​

完了した削除操作の記録を表示するには、SHOW DELETE 文を使用します。

構文

SHOW DELETE [FROM db_name];

例

mysql> SHOW DELETE FROM test_db;
+-----------+---------------+---------------------+-----------------+----------+
| TableName | PartitionName | CreateTime | DeleteCondition | State |
+-----------+---------------+---------------------+-----------------+----------+
| empty_tbl | p3 | 2020-04-15 23:09:35 | k1 EQ "1" | FINISHED |
| test_tbl | p4 | 2020-04-15 23:09:53 | k1 GT "80" | FINISHED |
+-----------+---------------+---------------------+-----------------+----------+
2 rows in set (0.00 sec)

パフォーマンスに関する推奨事項​

各テーブルモデルでの DELETE のパフォーマンス特性は次のとおりです。

テーブルモデル実行速度クエリへの影響推奨される用途
明細テーブル(Duplicate Key)高速短時間に大量の削除を実行するとクエリのパフォーマンスに影響します削除の頻度を抑えます
集約テーブル(Aggregate Key)高速短時間に大量の削除を実行するとクエリのパフォーマンスに影響します削除の頻度を抑えます
主キーテーブル(Unique Key)広範囲の削除では低速(INSERT INTO に変換されます)短時間に大量の削除を実行しても、クエリのパフォーマンスへの影響は限定的です頻繁に削除する場合に適しています

FAQ​

Q1:DELETE を実行すると、パーティションの指定が必要だというエラーが表示されます。どうすればよいですか?

Unique Key 以外のパーティションテーブルでは、条件にパーティション列が含まれていない場合や not in を使用している場合、Doris はパーティションを推定できません。次のいずれかの方法を使用します。

  • PARTITION を DELETE 文で明示的に指定します。
  • または、セッション変数 SET delete_without_partition = true を設定して、すべてのパーティションに削除を適用します。

Q2:集約テーブルの Key 以外の列を条件に削除できますか?

いいえ。集約テーブルでは、削除条件に指定できるのは Key 列だけです。

Q3:USING 句はどのテーブルモデルをサポートしていますか?

削除対象としてサポートされるのは、Unique Key モデルのテーブルだけです。

Q4:IN 述語の要素数が多すぎるというエラーが表示された場合、どうすればよいですか?

max_allowed_in_element_num_of_delete 設定を調整し、使用可能な要素数の上限(デフォルトは 1024)を引き上げます。

Q5:削除がタイムアウトした場合、どうすればよいですか?

SET insert_timeout = xxx を使用し、タイムアウトを秒単位で延長します。