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