Операция удаления
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 должен иметь возможность определить её по условиям. Определить партицию невозможно в следующих двух случаях:
- Условия не включают столбец партиционирования.
- Для столбца партиционирования в качестве
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) | Большое количество удалений за короткое время оказывает ограниченное влияние на производительность запросов | Подходит для сценариев с частыми удалениями |
Часто задаваемые вопросы
Вопрос 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 (в секундах), чтобы увеличить время ожидания.