Перейти к содержимому
Последнее обновление

Операция удаления

Apache Doris выполняет оператор DELETE через протокол MySQL для удаления данных из указанной таблицы или раздела по заданным условиям. Поддерживаются два варианта использования:

  • Удаление по предикатам: удаление данных, соответствующих простым комбинациям предикатов 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_nameСтолбец таблицы table_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. В этом случае операция удаления применяется ко всем разделам.

Примеры​

В примерах ниже используется my_table, таблица Unique Key с разделением по спискам значений k1 и разделами p1 и p2:

CREATE TABLE my_table (
k1 INT,
status VARCHAR(32),
dt DATE
)
UNIQUE KEY (k1)
PARTITION BY LIST (k1) (
PARTITION p1 VALUES IN (1, 2, 3, 4, 5),
PARTITION p2 VALUES IN (6, 7, 8, 9, 10)
)
DISTRIBUTED BY HASH (k1) BUCKETS 1
PROPERTIES ("replication_num" = "1");

INSERT INTO my_table VALUES
(1, 'active', '2024-09-01'),
(3, 'outdated', '2024-10-15'),
(5, 'active', '2024-10-20'),
(6, 'outdated', '2024-10-05'),
(8, 'outdated', '2024-10-25'),
(10, 'active', '2024-11-10');

Пример 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 удалена.

SELECT * FROM t1 ORDER BY id;
+----+----+----+--------+------------+
| 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ГлобальнаяМаксимально допустимое количество элементов в предикате IN1024

Просмотр истории удалений​

Используйте оператор 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)Большое количество удалений за короткое время оказывает ограниченное влияние на производительность запросовПодходит для сценариев с частыми удалениями

Часто задаваемые вопросы​

В1: При выполнении DELETE возникает ошибка о необходимости указать раздел. Что делать?

Для таблиц с разделами, не использующих модель Unique, Doris не может определить раздел, если условия не содержат столбец разделения или используют not in. Можно:

  • Явно указать PARTITION в операторе DELETE.
  • Или задать переменную сеанса SET delete_without_partition = true, чтобы удаление применялось ко всем разделам.

В2: Можно ли удалять данные из агрегатной таблицы по столбцам, не входящим в Key?

Нет. В агрегатных таблицах условия удаления можно задавать только для столбцов Key.

В3: Какие модели таблиц поддерживает предложение USING?

В качестве цели удаления поддерживаются только таблицы модели Unique Key.

В4: Что делать, если возникает ошибка из-за слишком большого количества элементов в предикате IN?

Измените параметр конфигурации max_allowed_in_element_num_of_delete, чтобы увеличить максимально допустимое количество элементов (по умолчанию 1024).

В5: Что делать, если время ожидания удаления истекло?

Используйте SET insert_timeout = xxx (в секундах), чтобы увеличить время ожидания.