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