TRUNCATE HISTORY

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

Поддерживается в версиях:  6.8 / 6.7 / 6.6 / 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, выбираются все записи таблицы независимо от их актуальности.

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

Подробнее о партиционировании см. в разделе Партиционирование данных.

Если в запросе указано ключевое слово infinite, при удалении записей система также обнуляет значение ROWS_COUNT в статистике обработки запросов по целевой логической таблице на всех нодах Prostore. Подробнее см. в разделе Статистика обработки запросов > Как TRUNCATE ACTUAL, TRUNCATE HISTORY и ERASE DELTA влияют на статистику.

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

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

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

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

Удаление исторических записей по состоянию на 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 задает режим удаления записей. Возможные значения:

  • строковая метка времени в любом из форматов, описанных в разделе Форматы даты и времени в запросах — удаление исторических записей по состоянию на указанный момент времени;
  • '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

Удаление записей, имеющих значение product_units меньше 10 и неактуальных на момент времени '2019-12-23 15:15:14.736193', из обычной логической таблицы sales:

TRUNCATE HISTORY marketing.sales FOR SYSTEM_TIME AS OF '2019-12-23 15:15:14.736193'
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