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

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

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. В этом случае операция удаления применяется ко всем партициям.

Примеры​

Пример 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ГлобальнаяМаксимальное допустимое количество элементов в предикате 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 (в секундах), чтобы увеличить время ожидания.