본문으로 건너뛰기
최종 수정: 에

삭제 작업

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 모델이 아닌 파티션 테이블: 파티션을 지정하지 않았고 파티션을 추론할 수도 없다면 세션 변수를 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로 변환됨)짧은 시간에 많은 삭제 작업을 수행해도 쿼리 성능에 미치는 영향이 제한적임삭제가 빈번한 시나리오에 적합

자주 묻는 질문​

Q1: DELETE를 실행하면 파티션을 지정해야 한다는 오류가 발생합니다. 어떻게 해야 하나요?

Unique 모델이 아닌 파티션 테이블에서 조건에 파티션 컬럼이 포함되어 있지 않거나 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를 사용하여 제한 시간을 늘립니다(단위: 초).