TRUNCATE HISTORY
Содержание раздела
Поддерживается в версиях: 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 / 5.1 / 5.0.
Запрос удаляет следующие записи логической таблицы, соответствующие условию WHERE
:
- исторические записи на указанный момент времени — если в запросе указана метка времени;
- текущие и исторические записи — если в запросе указано ключевое слово
infinite
.
В отличие от запросов загрузки и обновления данных, запрос TRUNCATE HISTORY
удаляет записи окончательно, а не переводит их в категорию исторических.
Удаление данных с помощью TRUNCATE HISTORY
не версионируется системой и не может быть отменено.
Подробнее обо всех способах управления историей см. в разделе Управление историей изменений данных.
Как работает запрос
Система выбирает все записи, которые соответствуют условию, указанному в запросе, и удаляет их. Записи к удалению выбираются так:
- если в запросе указана метка времени, система определяет последнюю закрытую на тот момент дельту и выбирает записи таблицы, которые стали неактуальными в этой дельте и ранее;
- иначе, если указано ключевое слово
infinite
, выбираются все записи таблицы независимо от их актуальности.
Выбранные записи удаляются окончательно из всех датасорсов, где размещены данные логической таблицы, включая датасорсы с холодными и партиционированными данными.
Если запрос исполняется для партиционированной таблицы записи, соответствующие указанной метке времени и условию, удаляются из всех партиций этой таблицы.
Подробнее о партиционировании см. в разделе Партиционирование данных.
Пример работы запроса
Рассмотрим пример работы запроса TRUNCATE HISTORY
, показанный на рисунке ниже.
Логическая таблица, из которой удаляются данные, содержит три записи по одной торговой точке, принадлежащие разным версиям данных в истории изменений. Первая запись была добавлена в январе, затем эта запись была обновлена в апреле и августе.
Для наглядности предположим, что все три записи были добавлены в трех последовательных дельтах, между которыми нет других дельт. В этом случае запрос TRUNCATE HISTORY
с меткой времени '2021-04-10 00:00:10'
удаляет только первую запись, так как на указанный момент времени вторая запись принадлежала текущей версии (относилась к последней закрытой дельте) и исторической была только первая запись.
Синтаксис
TRUNCATE HISTORY [db_name.]table_name FOR SYSTEM_TIME AS OF date_time_expression
[WHERE filter_expression]
Параметры:
db_name
-
Имя логической базы данных. Опционально, если выбрана логическая БД, используемая по умолчанию.
table_name
-
Имя логической таблицы, из которой удаляются записи. Таблица может быть любого вида.
Ключевое слово FOR SYSTEM_TIME AS OF
Ключевое слово FOR SYSTEM_TIME AS OF
задает режим удаления записей. Возможные значения:
'YYYY-MM-DD hh:mm:ss'
— удаление исторических записей по состоянию на указанный момент времени;'infinite'
— удаление всех текущих и исторических записей.
Ключевое слово WHERE
Ключевое слово WHERE
задает условие выбора удаляемых записей. Поддерживается только простой фильтр без подзапросов, соединений и других операций.
Варианты ответа
В ответе возвращается:
- пустой объект ResultSet при успешном выполнении запроса;
- исключение при неуспешном выполнении запроса.
Ограничения
- Условие
WHERE
не может содержать подзапросы, соединения и другие операции. Поддерживается только простой фильтр. - Запрос не поддерживает удаление данных из материализованных представлений.
- Удаление данных невозможно отменить.
Примеры
Удаление исторических записей из обычной логической таблицы
Удаление записей, имеющих значение product_units
меньше 10
и неактуальных на момент времени '2019-12-23 15:15:14'
, из обычной логической таблицы sales
:
TRUNCATE HISTORY marketing.sales FOR SYSTEM_TIME AS OF '2019-12-23 15:15:14'
WHERE product_units < 10
Удаление исторических записей из партиционированной таблицы
Удаление записей, имеющих значение store_id >= 100
и неактуальных на момент времени '2023-05-11 12:49:54'
, из партиционированной таблицы sales_partitioned
:
TRUNCATE HISTORY marketing.sales_partitioned FOR SYSTEM_TIME AS OF '2023-05-11 12:49:54'
WHERE store_id >= 100
Удаление исторических записей из партиции
Удаление записей, неактуальных на момент времени '2023-05-12 15:15:14'
, из партиции sales_feb_2023
:
TRUNCATE HISTORY marketing.sales_feb_2023 FOR SYSTEM_TIME AS OF '2023-05-12 15:15:14'
Удаление текущих и исторических записей
Удаление всех записей, где значение id
равно 1005
или 105
, из таблицы sales
:
TRUNCATE HISTORY marketing.sales FOR SYSTEM_TIME AS OF 'infinite'
WHERE id = 1005 or id = 105