TRUNCATE ACTUAL

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

Поддерживается в версиях:  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.

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

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

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

Отсутствие влияния на нумерацию дельт и операций

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

Отличие от запросов загрузки и обновления данных

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

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

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

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

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

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

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

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

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

Удаление текущих и исторических записей после 2021-03-07 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 задает момент времени, после которого удаляются записи (исключая указанный момент). Значение можно задать в любом из форматов, описанных в разделе Форматы даты и времени в запросах.

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

Ключевое слово 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:12'
WHERE region = 'Калуга';

-- использование момента времени с точностью до миллисекунд
TRUNCATE ACTUAL marketing.stores FOR SYSTEM_TIME AS OF '2021-04-10 01:00:12.273'
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'