TRUNCATE ACTUAL

Содержание раздела
  1. Сохранение нумерации дельт и операций
  2. Как работает запрос
  3. Пример работы запроса
  4. Синтаксис
    1. Ключевое слово FOR SYSTEM_TIME AS OF 'YYYY-MM-DD hh:mm:ss[.SSSSSS]'
    2. Ключевое слово FOR SYSTEM_TIME AS OF DELTA_NUM delta_num
    3. Ключевое слово WHERE condition
  5. Варианты ответа
  6. Ограничения
    1. Ограничения выполнения
    2. Ограничения сущностей
    3. Ограничения WHERE
    4. Другие ограничения
  7. Примеры
    1. Удаление записей логической таблицы с указанием дельты
    2. Удаление записей логической таблицы с указанием момента времени
    3. Удаление записей материализованного представления
    4. Удаление записей партиционированной таблицы
    5. Удаление записей партиции

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

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

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

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

Сохранение нумерации дельт и операций

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

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

Запрос удаляет записи в следующем порядке:

  1. Удаляются текущие и исторические записи согласно условию WHERE, включая холодные и партиционированные записи:
    • если указана метка времени, удаляются записи после операции записи, которая была последней в сущности на тот момент;
    • если указана дельта, удаляются записи после нее.
  2. Восстанавливаются и становятся текущими все исторические записи, соответствующие условию WHERE и действовавшие на указанный момент времени или дельту, но замененные или удаленные позже.
  3. Обнуляется 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 'YYYY-MM-DD hh:mm:ss[.SSSSSS]'
[WHERE condition]

Удаление записей после указанной дельты:

TRUNCATE ACTUAL [db_name.]entity_name 
FOR SYSTEM_TIME AS OF DELTA_NUM delta_num
[WHERE condition]

Параметры:

db_name

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

entity_name

Имя сущности, из которой удаляются записи.

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

Ключевое слово FOR SYSTEM_TIME AS OF 'YYYY-MM-DD hh:mm:ss[.SSSSSS]'

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

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

Ключевое слово FOR SYSTEM_TIME AS OF DELTA_NUM delta_num

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

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

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

Если ключевое слово не указано, удаляются все текущие и исторические записи после указанного момента времени.

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

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

  • пустой объект 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 matview_db.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'