TRUNCATE ACTUAL
Содержание раздела
Поддерживается в версиях: 6.6 / 6.5 / 6.4 / 6.3 / 6.2 / 6.1 / 6.0 / 5.8 / 5.7.
Запрос удаляет текущие и исторические записи логической таблицы или материализованного представления с указанного по настоящий момент времени. Записи к удалению выбираются по условию в блоке WHERE
.
Подробнее обо всех способах управления историей см. в разделе Управление историей изменений данных.
Удаление данных с помощью TRUNCATE ACTUAL
не версионируется системой и не может быть отменено.
Запрос недоступен для логических таблиц с retention-правилами, предназначенными для остужения данных. Ограничение также распространяется на партиционированные таблицы, партиции которых имеют retention-правила для остужения данных.
Запрос не удаляет метаинформацию о дельтах и операциях записи: их нумерация остается прежней.
В отличие от запросов загрузки и обновления данных, запрос TRUNCATE ACTUAL
удаляет записи окончательно, а не переводит их в категорию исторических.
Как работает запрос
Запрос отменяет изменения, внесенные в данные таблицы или представления с указанного момента времени. Происходит это следующим образом:
- Если в запросе указана метка времени, система определяет последнюю закрытую на тот момент дельту.
- Система удаляет текущие и исторические записи таблицы или представления, которые соответствуют условию
WHERE
и были добавлены в следующих отрезках истории изменений:- в дельте, которая указана в запросе или вычислена системой на шаге 1;
- между этой дельтой и предыдущей;
- во всех последующих операциях записи и закрытых дельтах.
- Система восстанавливает и переводит в категорию текущих записей те записи, которые соответствуют условию
WHERE
и действовали до указанного момента времени, но были удалены или обновлены в этот момент времени или после него.
Изменения данных отменяются во всех датасорсах, где размещены данные целевой сущности, включая датасорсы с холодными и партиционированными данными. Если запрос исполняется для партиционированной таблицы, система отменяет изменения данных во всех партициях этой таблицы.
При отмене изменений данных в логической таблице система не обновляет материализованные представления, связанные с этой таблицей. Представления продолжают содержать данные, удаленные из таблицы.
Пример работы запроса
Рассмотрим пример работы запроса TRUNCATE ACTUAL
, показанный на рисунке ниже.
Логическая таблица, из которой удаляются данные, содержит три записи по одной торговой точке, принадлежащие разным версиям данных в истории изменений. Первая запись была добавлена в январе, затем эта запись была обновлена в апреле и августе.
Для наглядности предположим, что все три записи были добавлены в трех последовательных дельтах, между которыми нет других дельт. В этом случае запрос TRUNCATE ACTUAL
с меткой времени '2021-04-10 00:00:10'
удаляет две записи из трех: вторую (от 9 апреля) и третью (от 25 августа). Вторая запись удаляется, так как она была добавлена в дельте, которая была последней на 10 апреля, и запрос удаляет изменения, начиная с этой дельты включительно. Оставшаяся версия записи, добавленная 17 января, становится текущей для магазина 555
.
Синтаксис
Удаление записей, начиная с указанного момента времени (включительно):
TRUNCATE ACTUAL [db_name.]entity_name FOR SYSTEM_TIME AS OF date_time_expression
[WHERE filter_expression]
Удаление записей, начиная с указанной дельты (включительно):
TRUNCATE ACTUAL [db_name.]entity_name FOR SYSTEM_TIME AS OF DELTA_NUM delta_num
[WHERE filter_expression]
Параметры:
db_name
-
Имя логической базы данных. Опционально, если выбрана логическая БД, используемая по умолчанию.
entity_name
-
Имя сущности, из которой удаляются записи.
Возможные значения: имя логической таблицы, имя материализованного представления. Логическая таблица может быть любого вида.
Ключевое слово FOR SYSTEM_TIME AS OF
Ключевое слово FOR SYSTEM_TIME AS OF
задает момент времени, начиная с которого удаляются записи (включительно). Значение указывается в формате в формате 'YYYY-MM-DD hh:mm:ss'
.
Если ключевое слово указано, система определяет предпоследнюю закрытую дельту на указанный момент времени и удаляет все изменения, внесенные после закрытия этой дельты.
Ключевое слово FOR SYSTEM_TIME AS OF DELTA_NUM
Ключевое слово FOR SYSTEM_TIME AS OF DELTA_NUM
задает номер дельты, начиная с которой удаляются записи (включительно).
Ключевое слово WHERE
Ключевое слово WHERE
задает условие выбора удаляемых записей. Значение может быть любым простым фильтром на основе некоторых или всех столбцов первичного ключа. Условия на другие столбцы не поддерживаются.
Если ключевое слово не указано, удаляются все текущие и исторические записи с указанного момента времени.
Варианты ответа
В ответе возвращается:
- пустой объект ResultSet при успешном выполнении запроса;
- исключение при неуспешном выполнении запроса.
Ограничения
Ограничения выполнения
- Во время работы запроса не допускается выполнение BEGIN DELTA.
Ограничения сущностей
- Запрос недоступен для обычных логических таблиц с retention-правилами, предназначенными для остужения данных, а также для партиционированных таблиц, партиции которых имеют retention-правила для остужения данных.
- Запрос недоступен для несинхронизированных материализованных представлений.
- Когда записи удаляются из таблицы, все связанные с ней материализованные представления остаются в прежнем состоянии и продолжают хранить данные, удаленные из таблицы.
Ограничения WHERE
- Условие
WHERE
не может содержать подзапросы, соединения и другие операции. Поддерживается только простой фильтр. - Выражение в условии
WHERE
может содержать только те столбцы, которые входят в первичный ключ указанной сущности.
Другие ограничения
- Удаление данных невозможно отменить.
Примеры
Удаление записей логической таблицы с указанием дельты
Удаление записей, в которых значение id
входит в заданный список, из таблицы sales
:
TRUNCATE ACTUAL marketing.sales FOR SYSTEM_TIME AS OF DELTA_NUM 6
WHERE id IN (111, 222, 333, 444)
Удаление записей логической таблицы с указанием момента времени
Удаление записей о магазинах, расположенных в Калуге, из таблицы stores
:
TRUNCATE ACTUAL marketing.stores FOR SYSTEM_TIME AS OF '2021-04-10 01:00:00'
WHERE region = 'Калуга'
Удаление записей материализованного представления
Удаление записей, в которых значение id
больше 1001, из материализованного представления sales_and_stores
:
TRUNCATE ACTUAL marketing.sales_by_stores FOR SYSTEM_TIME AS OF '2022-04-23 15:15:14'
WHERE id > 1001
Удаление записей партиционированной таблицы
Удаление записей, в которых дата транзакции позже 10 января 2023, из партиционированной таблицы sales_partitioned
:
TRUNCATE ACTUAL marketing.sales_partitioned FOR SYSTEM_TIME AS OF '2023-05-10 15:40:14'
WHERE transaction_date > '2023-01-10 00:00:00'
Удаление записей партиции
Удаление записей из партиции sales_jan_2023
:
TRUNCATE ACTUAL marketing.sales_jan_2023 FOR SYSTEM_TIME AS OF '2023-05-10 15:28:52'