Удаление разделов в Vertica
У меня есть таблица, как показано ниже в Vertica,
Seq_No CO_NO DATE
1 PQ01 01-Sep-15
2 XY01 01-Oct-15
3 AB01 01-Nov-15
4 PQ02 01-Dec-15
. . .
. . .
. . .
14 XYZ9 01-Oct-16
И таблица имеет разделение по месяцам и годам на основе столбца DATE.
В любой момент времени должно быть только 13 разделов, т.е. 13 месяцев данных. Если данные за текущие месяцы поступают (16 октября), то нам нужно отбросить разделение по месяцам СЕНТЯБРЯ прошлых лет (15 сентября), сохранив в таблице только 13 разделов (т.е. данные за последние 13 месяцев).
Как мы можем достичь этого в Vertica?
2 ответа
Для этого используйте процедуру удаления раздела
SELECT DROP_PARTITION('schema.table',CAST(TO_CHAR(ADD_MONTHS(SYSDATE,-13),'YYYYMM') AS INTEGER));
Что вам нужно, так это работа cron, которая будет выполняться каждое начало месяца.
Перед тем как сбросить все разделы до 13 вручную, дайте работе сделать свое дело.
Примечание: ваша таблица должна быть разделена следующим образом:
PARTITION BY (((date_part('year', Datecol) * 100) + date_part('month', Datecol)))
- протестируйте удаленный раздел перед его использованием, создайте фиктивную таблицу и запустите ее.
Я предполагаю, что вы сосредоточены на "в любой момент времени" часть вашего вопроса. Думаю, одно из двух решений.
Добавьте скрипт к вашей загрузочной работе, который найдет любые разделы старше вашего порога и сбросит их (посмотрите на
partitions
Если вы пытаетесь придумать более общий подход, вы можете извлечь выражение раздела изtables
системный вид).Вместо того, чтобы располагаться поверх разделов, вы можете просто создать представление вокруг своей таблицы и использовать его вместо отображения только данных за последний год. Пример:
create view myview as select * from mytable where mydate >= current_timestamp - interval '1 year'
Или что-то подобное, как trunc(current_timestamp - interval '1 year','MM')
и т. д. Тогда вы можете сбросить разделы на досуге.