TRUNCATE ACTUAL

Содержание раздела
  1. Как работает запрос
  2. Пример работы запроса
  3. Синтаксис
    1. Ключевое слово FOR SYSTEM_TIME AS OF
    2. Ключевое слово FOR SYSTEM_TIME AS OF DELTA_NUM
    3. Ключевое слово WHERE
  4. Варианты ответа
  5. Ограничения
    1. Ограничения выполнения
    2. Ограничения сущностей
    3. Ограничения WHERE
    4. Другие ограничения
  6. Примеры
    1. Удаление записей логической таблицы с указанием дельты
    2. Удаление записей логической таблицы с указанием момента времени
    3. Удаление записей материализованного представления
    4. Удаление записей партиционированной таблицы
    5. Удаление записей партиции

Поддерживается в версиях:  6.5 / 6.4 / 6.3 / 6.2 / 6.1 / 6.0 / 5.8 / 5.7.

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

Подробнее обо всех способах управления историей см. в разделе Управление историей изменений данных.

Удаление данных с помощью TRUNCATE ACTUAL не версионируется системой и не может быть отменено.

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

Запрос не удаляет метаинформацию о дельтах и операциях записи: их нумерация остается прежней.

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

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

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

  1. Если в запросе указана метка времени, система определяет последнюю закрытую на тот момент дельту.
  2. Система удаляет текущие и исторические записи таблицы или представления, которые соответствуют условию WHERE и были добавлены в следующих отрезках истории изменений:
    • в дельте, которая указана в запросе или вычислена системой на шаге 1;
    • между этой дельтой и предыдущей;
    • во всех последующих операциях записи и закрытых дельтах.
  3. Система восстанавливает и переводит в категорию текущих записей те записи, которые соответствуют условию WHERE и действовали до указанного момента времени, но были удалены или обновлены в этот момент времени или после него.

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

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

Пример работы запроса

Рассмотрим пример работы запроса TRUNCATE ACTUAL, показанный на рисунке ниже.

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

Для наглядности предположим, что все три записи были добавлены в трех последовательных дельтах, между которыми нет других дельт. В этом случае запрос TRUNCATE ACTUAL с меткой времени '2021-04-10 00:00:10' удаляет две записи из трех: вторую (от 9 апреля) и третью (от 25 августа). Вторая запись удаляется, так как она была добавлена в дельте, которая была последней на 10 апреля, и запрос удаляет изменения, начиная с этой дельты включительно. Оставшаяся версия записи, добавленная 17 января, становится текущей для магазина 555.

Удаление текущих и исторических записей, начиная с 2021-04-10 00:00:10

Синтаксис

Удаление записей, начиная с указанного момента времени (включительно):

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'