DELETE

Содержание раздела
  1. Поддерживаемые сущности
  2. Особенности удаления данных из партиционированных таблиц и партиций
  3. Особенности удаления данных из standalone-таблиц
  4. Как работает запрос
    1. Выбор датасорса-источника для SELECT-подзапроса в WHERE
    2. Удаление из логических таблиц
    3. Удаление из снапшот-таблиц
    4. Удаление из прокси-таблиц и standalone-таблиц
    5. Выполнение при отключенном датасорсе
    6. Статистика
  5. Перезапуск и отмена операций
  6. Синтаксис
    1. Ключевое слово WHERE condition
      1. Особенности SELECT-подзапросов в WHERE
      2. Особенности партиционированных таблиц
    2. Ключевое слово RETRY
  7. Варианты ответа
  8. Ограничения
    1. Ограничения выполнения
    2. Ограничения сущностей
    3. Ограничения ключевых слов
    4. Ограничения партиционирования
    5. Другие ограничения
  9. Примеры
    1. Удаление записей логической таблицы в дельте
    2. Удаление записей логической таблицы вне дельты
    3. Удаление записей снапшот-таблицы
    4. Удаление партиционированных записей
    5. Удаление записей прокси-таблицы
    6. Удаление записей standalone-таблицы
    7. Перезапуск операции по удалению записей

Поддерживается в версиях: 7.6 / 7.5 / 7.4 / 7.3 / 7.2 / 7.1 / 7.0 / 6.12 / 6.11 / 6.10 / 6.9 / 6.8 / 6.7 / 6.6 / 6.5 / 6.4 / 6.3 / 6.2 / 6.1 / 6.0 / 5.8 / 5.7 / 5.6 / 5.5 / 5.4 / 5.3 / 5.2.

Запрос удаляет записи из таблицы согласно указанному условию.

Чтобы удалить большой объем данных, используйте загрузку данных.

В отличие от запросов TRUNCATE HISTORY и TRUNCATE ACTUAL, запрос DELETE не удаляет историю данных.

Поддерживаемые сущности

Удаление данных доступно из сущностей и СУБД, перечисленных ниже.

* Партицированные таблицы, партиции и снапшот-таблицы могут размещаться только в ADP.

Особенности удаления данных из партиционированных таблиц и партиций

Одновременное удаление данных из партиционированной таблицы и ее партиций недоступно: возможно либо удаление из партиционированной таблицы, либо параллельное удаление напрямую из любого количества партиций этой таблицы.

Подробнее о партиционировании см. в разделе О партиционировании.

Особенности удаления данных из standalone-таблиц

Удаление данных из standalone-таблиц выполняется через внешние writable-таблицы.

Как работает запрос

Выбор датасорса-источника для SELECT-подзапроса в WHERE

Если запрос содержит SELECT-подзапрос в условии WHERE, источником данных служит датасорс (по убыванию приоритета):

  1. указанный в DATASOURCE_TYPE;
  2. подходящий для партиционированных и снапшот-таблиц подзапроса:
    1. первый по алфавиту среди подходящих для снапшот-таблиц со строгой консистентностью данных;
    2. наиболее подходящий для чтения/трансфера данных партиционированной или снапшот-таблицы, служащей источником/приемником;
  3. каждый целевой датасорс сам для себя (при наличии в них данных SELECT);
  4. подходящий для всех сущностей SELECT-подзапроса:
    1. [HTTP] вычисленный по queryId из подходящих;
    2. случайный из подходящих.

Удаление из логических таблиц

При удалении из логической таблицы записи переводятся в категорию исторических: на физическом уровне для них проставляется номер текущей версии как последней, в которой эти записи действовали, и признак удаления (sys_op = 1).

Удаление из снапшот-таблиц

Порядок удаления записей из снапшот-таблицы зависит от значения ее опций set.delete.tracking.enable и set.on.conflict.do, как показано ниже.

Значение set.delete.tracking.enable Значение set.on.conflict.do Обработка записей к удалению
true update Записи помечаются как удаленные (sys_op = 1)
true error Все изменения по запросу отбрасываются и возвращается ошибка
true nothing Все изменения по запросу пропускаются и возвращается успешный ответ
false update / error / nothing Записи удаляются окончательно

В отличие от логических таблиц, снапшот-таблицы не хранят исторические записи: каждая запись содержит либо текущее состояние объекта, либо информацию об удалении объекта (если включено отслеживание удалений).

Удаление из прокси-таблиц и standalone-таблиц

Записи прокси-таблиц и standalone-таблиц удаляются окончательно.

Выполнение при отключенном датасорсе

Отключенный датасорс пропускается при исполнении запроса. Удаление данных считается успешным, если данные сохранены в необходимые датасорсы.

Статистика

Запросы DELETE учитываются в категории WRITE статистики. Подробнее о категориях запросов в статистике см. в разделе GET_ENTITY_STATISTICS, о способах просмотра статистики — в разделе Управление статистикой.

Перезапуск и отмена операций

Кластер с кворумом нод автоматически отменяет сбойные операции записи при типовых сбоях, исключая необходимость ручного вмешательства.

Возможности по ручному управлению операциями описаны в разделе Управление операциями записи.

Синтаксис

Удаление записей:

DELETE FROM [db_name.]table_name [WHERE condition]

Перезапуск операции по удалению записей:

RETRY DELETE FROM [db_name.]table_name [WHERE condition]

Параметры:

db_name

Имя логической базы данных. Опционально, если выбрана логическая БД, используемая по умолчанию.

table_name

Имя таблицы, из которой удаляются записи. Возможные значения:

  • имя логической таблицы,
  • имя снапшот-таблицы,
  • имя прокси-таблицы,
  • имя внешней writable-таблицы, указывающей на нужную standalone-таблицу.

Логическая таблица может быть любого вида.

Ключевое слово WHERE condition

Задает условие выбора удаляемых записей. Может содержать сравнение с константами, SELECT-подзапросы и JOIN-соединения.

Если ключевое слово не указано, удаляются все записи таблицы.

Особенности SELECT-подзапросов в WHERE

Удаление с использованием SELECT-подзапроса доступно в любом из следующих случаев:

  • [локальное исполнение] все целевые датасорсы содержат выбираемые данные;
  • [трансфер между датасорсами] выбранный датасорс-источник также является одним из целевых датасорсов и поддерживает трансфер данных во все остальные целевые датасорсы (см. таблицу ниже).

В таблице ниже показаны сочетания типов датасорсов, между которыми поддерживается трансфер данных при исполнении запроса.

Сущности-источники Таблица-приемник Датасорс-источник Целевой датасорс
ADP ADG ADQM ADB
Любые, кроме снапшот-таблиц Любая из поддерживаемых ADP + +
ADB + + +
Снапшот-таблицы Логическая или снапшот-таблица ADP +
Прокси- или standalone-таблица ADP + +

Датасорсы таблицы можно указать при ее создании. Датасорсы существующей таблицы можно изменять для логических таблиц и снапшот-таблиц командами ALTER TABLE ADD DATASOURCE (добавляет датасорс) и DROP TABLE … DATASOURCE_TYPE (удаляет датасорс).

Особенности партиционированных таблиц

Условие WHERE в запросе к партиционированной таблице может содержать операторы:

  • >,
  • >=,
  • <,
  • <=,
  • =,
  • IN,
  • BETWEEN,
  • IS TRUE|FALSE|NULL,
  • IS NOT TRUE|FALSE.

Условие WHERE в запросе к партиционированной таблице может содержать только логические сущности, размещенные, как минимум, в датасорсах партиций, откуда удаляются данные. Например, если партиция 1 размещена в adp, а партиция 2 — в adp2:

  • [поддерживается] условие с таблицей в adp, adp2 и adb (есть пересечение с обеими партициями);
  • [не поддерживается] условие с таблицей в adp2 и adb (нет пересечения с партицией 1).

Ключевое слово RETRY

При типовых сбоях (перебои в сети, сбой ноды и т.п.) операции отменяются автоматически и не требуют ручного управления с помощью RETRY или других команд.

Перезапускает обработку операции записи со статусом 0 (Выполняется) в логической таблице. Если указано, после него должна следовать копия исходного запроса, создавшего перезапускаемую операцию.

Не поддерживается для других таблиц:

  • игнорируется для прокси- и standalone-таблиц;
  • приводит к ошибке для снапшот-таблиц.

Если ключевое слово не указано, система обрабатывает запрос как новый, а не перезапущенный.

Варианты ответа

В ответе возвращается:

  • объект ResultSet c одной записью при успешном выполнении запроса;
  • исключение при неуспешном выполнении запроса.

Успешный ответ содержит столбцы:

  • sysCn:
    • номер выполненной операции записи — при удалении из логической или снапшот-таблицы;
    • пустое значение — при удалении из прокси-таблицы или внешней writable-таблицы;
  • ts:
    • дата и время завершения операции записи в формате YYYY-MM-DD hh:mm:ss.SSSSSS — при выполнении операции вне дельты;
    • пустое значение — при выполнении операции в дельте;
  • rowsAffected — количество затронутых (добавленных, измененных и удаленных) строк. Расчет значения поддерживается для СУБД ADB и ADP.

Запрос с RETRY возвращает в rowsAffected количество строк, затронутых перезапущенной операцией записи. Строки, обработанные до перезапуска операции, не учитываются.

Ограничения

Ограничения выполнения

  • Выполнение запроса к логической или снапшот-таблице недоступно, если она участвует в незавершенной операции по изменению схемы.
  • Выполнение запроса вне дельты недоступно, если последняя дельта закрыта с меткой времени, превышающей серверное время.
  • Не допускается параллельное выполнение идентичных запросов.

Ограничения сущностей

  • Запрос доступен для логических, снапшот-, прокси- и standalone-таблиц.
  • Удаление записей standalone-таблиц и прокси-таблиц доступно только из СУБД ADB и ADP.
  • Невозможно удаление записей из снапшот-таблиц с комбинациями опций:
    • set.delete.tracking.enable=true + set.on.conflict.do=error (возвращается ошибка);
    • set.delete.tracking.enable=true + set.on.conflict.do=nothing (удаление пропускается без ошибки).

Ограничения ключевых слов

  • В условии WHERE не допускается использование функций, которые приводят к разным результатам в разных СУБД. Примеры таких функций — это операции над числами с плавающей запятой: сравнение с ними, округление и т.д.
  • Ключевое слово RETRY доступно только для логических таблиц; для других таблиц игнорируется или приводит к ошибке.

Ограничения партиционирования

  • Условие в запросе на удаление данных из партиционированной таблицы должно быть вычисляемо в каждом из датасорсов, где расположены данные партиций, из которых удаляются записи.
  • Одновременная запись данных (загрузка, вставка и удаление) в партиционированную таблицу и ее партиции недоступна.

Другие ограничения

  • Запрос не удаляет данные с меткой времени, превышающей текущее время сервера.
  • При обработке запроса отключенные (Датасорс, отключенный системой из-за сбоя или администратором
    )
    датасорсы (СУБД или кластер СУБД хранилища
    )
    пропускаются без возврата ошибки. Ошибка возвращается, если не осталось включенных (Датасорс, работающий в штатном режиме
    )
    датасорсов, необходимых для записи данных.

Примеры

Удаление записей логической таблицы в дельте

-- выбор логической базы данных marketing в качестве базы данных по умолчанию
USE marketing;

-- открытие новой дельты
BEGIN DELTA;

-- удаление записей по условию с константой
DELETE FROM sales WHERE store_id = 234;

-- удаление записей по условию с подзапросом
DELETE FROM sales WHERE store_id IN 
  (SELECT id FROM stores WHERE region = 'Калуга' OR region = 'Нижний Новгород');

-- закрытие дельты
COMMIT DELTA;

Удаление записей логической таблицы вне дельты

-- удаление записей по условию с константой вне дельты
DELETE FROM marketing.sales WHERE store_id < 123;

Удаление записей снапшот-таблицы

DELETE FROM marketing.sales_snapshot WHERE transaction_date < DATE_TRUNC(YEAR, TIMESTAMPADD(YEAR, -1, current_date))

Удаление партиционированных записей

-- выбор логической базы данных marketing в качестве базы данных по умолчанию
USE marketing;

-- открытие новой дельты
BEGIN DELTA;

-- удаление записей за вторую половину января и февраль 2023 из партиционированной таблицы
DELETE FROM sales_partitioned 
WHERE transaction_date BETWEEN '2023-01-16 00:00:00' AND '2023-01-31 23:59:59' OR 
      transaction_date BETWEEN '2023-02-01 00:00:00' AND '2023-02-28 23:59:59';
 
-- удаление записей из партиции за февраль 2023
DELETE FROM sales_feb_2023 
WHERE product_code IN ('ABC11', 'ABC0002'); 
 
-- закрытие дельты
COMMIT DELTA;

Удаление записей прокси-таблицы

DELETE FROM marketing.payments_proxy WHERE type_code IN ('AC', 'AG', 'AK') AND agreement_id <> 100

Удаление записей standalone-таблицы

-- удаление записей standalone-таблицы, 
-- на которую указывает внешняя writable-таблица agreements_ext_write_adp
DELETE FROM marketing.agreements_ext_write_adp WHERE client_id < 150

Перезапуск операции по удалению записей

-- выбор логической базы данных marketing в качестве базы данных по умолчанию
USE marketing;

-- открытие новой дельты
BEGIN DELTA;

-- удаление записей логической таблицы sales о покупках в магазине
DELETE FROM sales WHERE store_id = 123;

-- перезапуск обработки операции по удалению записей
RETRY DELETE FROM sales WHERE store_id = 123;

-- закрытие дельты
COMMIT DELTA;