Оператор сравнения Vertica с отметкой времени

У меня есть миллиард записей в таблице Vertica с times_tamp в типе данных timestamptz. Я хочу удалить записи старше 90 дней в одном выражении. Как мне это сделать ?


person roy    schedule 04.08.2014    source источник


Ответы (1)


Лучшей практикой является явное определение даты как части вашего запроса:

DELETE FROM [schema].table WHERE times_stamp <= '2014-05-06';

Однако вы можете выполнить это динамически, используя:

DELETE FROM [schema].table WHERE DATEDIFF(day, times_stamp, SYSDATE()) >= 90;

При этом будут удалены строки, в которых разница в днях больше или равна 90.

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

Рассмотрите возможность использования секций в будущем, поскольку удаление строк требует больших затрат (контейнеры необходимо будет реорганизовать). Если вы разбиваете, например, на месяц, вы сможете немедленно удалить эти контейнеры.

person Kermit    schedule 04.08.2014
comment
У нас есть эти данные, разбитые по неделям. мы будем хранить в нем данные за 90 дней. Это хороший способ? - person roy; 04.08.2014
comment
Оценивая около 13 недель данных, вы выкачиваете и сбрасываете данные? Непонятно, у вас скользящее окно или по истечении 90 дней вы просто сбрасываете всю таблицу. - person Kermit; 04.08.2014
comment
Да, мы добавляем новые данные каждый час и удаляем данные старше 90 дней. - person roy; 04.08.2014
comment
Это ресурсоемкий процесс. Я бы удалял данные только раз в неделю на разделе. - person Kermit; 05.08.2014
comment
Я думаю, что это хорошая мысль, удалять данные на выходных, когда нагрузки меньше или нет. - person roy; 05.08.2014
comment
@user3579198 Ага. Прочтите эту документацию о том, как удалить весь недельный раздел. - person Kermit; 05.08.2014
comment
Удаление данных в конце недели: если вы удаляете разделы, это почти мгновенный и бесплатный процесс, не требующий особых ресурсов. Удаление раздела раз в неделю — лучший вариант. - person Guillaume; 05.08.2014
comment
На побочном узле, если вы пойдете по маршруту DELETE, у вас в конечном итоге будет много векторов удаления, которые, если вы не очистите свою таблицу, окажут очень плохое влияние на производительность (у нас было замедление на порядки). - person Guillaume; 05.08.2014
comment
Небольшой комментарий ко второму SELECT: поскольку он применяет функцию ко всем строкам вашего столбца, он будет очень медленным, так как Vertica не сможет его оптимизировать и должна будет обрабатывать каждую строку отдельно. Лучшим вариантом является перенос вычислений на другую сторону знака «=», который затем будет вычисляться только один раз для всего запроса: DELETE FROM [schema].table WHERE time_stamp ‹= NOW() - INTERVAL '90 day' . Но посмотрите мой предыдущий комментарий, у вас будут проблемы с удалением векторов, если вы будете использовать его как есть. - person Guillaume; 05.08.2014
comment
@Guillaume, что касается функции в предикате, мне было бы очень любопытно, действительно ли Vertica выполняет этот тип оптимизации. - person Kermit; 05.08.2014
comment
@Kermit Пока поле изолировано без обернутой функции или выражения, а другая сторона является литералом или выражением, которое возвращает литерал, у Vertica есть потенциал для оптимизации (весьма вероятно, на основе минимального / максимального значения ROS, тогда, если отсортировано, возможно, дальше). - person woot; 06.08.2014