Skip to main content
Question

deleting data in tables

  • June 13, 2023
  • 1 reply
  • 6 views

perton

Hello, I have installed the Vertica cluster. I created a database and two tables. I need to delete data in tables older than ten days automatically. I think that I must use PARTITION BY EXTRACT, but I can't understand how to do it

1 reply

mosheg
Forum|alt.badge.img+2
  • Participating Frequently
  • June 13, 2023

Please consider the following example to keep data from last 7 days, and delete everything else before:

-- Create a partition key for each unique order_date day and divide the data into separate ROS containers accordingly.
CREATE TABLE public.my_table
(
    order_no int,
    order_date timestamp NOT NULL,
    shipper varchar(20),
    ship_date date
)
PARTITION BY DATE(order_date);

\set DEMO_ROWS 10

INSERT INTO public.my_table
WITH myrows AS (SELECT
row_number() over()    AS order_no,
NOW() - RANDOMINT(30) AS order_date
FROM ( SELECT 1 FROM ( SELECT NOW() as se union all
SELECT NOW() + :DEMO_ROWS - 1 AS se) a timeseries ts AS '1 day' OVER (ORDER BY se)) b)
SELECT order_no, order_date, 'something', order_date AS ship_date
FROM myrows
ORDER BY order_no;
COMMIT;

SELECT date(order_date),
       CASE WHEN DATE(order_date) <= DATE(now() -7) THEN 'Will be droped' ELSE 'Will keep' END as Status
FROM public.my_table ORDER BY 1;

--     date    |     Status
-- ------------+----------------
--  2020-04-23 | Will be droped
--  2020-04-24 | Will be droped
--  2020-04-28 | Will be droped
--  2020-04-30 | Will be droped
--  2020-05-03 | Will be droped
--  2020-05-10 | Will be droped
--  2020-05-10 | Will be droped
--  2020-05-12 | Will be droped
--  2020-05-14 | Will keep
--  2020-05-20 | Will keep
--  (10 rows)

-- The following DROP_PARTITIONS statement drops from table my_table all order records associated with partition key 10 days ago to 30 days ago.
SELECT DROP_PARTITIONS ('my_table', DATE(NOW()-365), DATE(now() -7));
--   DROP_PARTITIONS
-- -------------------
--  Partition dropped
-- (1 row)

SELECT date(order_date),
       CASE WHEN DATE(order_date) <= DATE(now() -7) THEN 'Will be droped' ELSE 'Will keep' END as Status
FROM public.my_table ORDER BY 1;
--     date    |  Status
-- ------------+-----------
--  2020-05-14 | Will keep
--  2020-05-20 | Will keep
-- (2 rows)

SELECT COUNT (partition_key) NumPartitions, ros_id, node_name, SUM(ROS_SIZE_BYTES) as ROS_SIZE_BYTES, SUM(ROS_ROW_COUNT) as ROS_ROW_COUNT
FROM PARTITIONS
WHERE projection_name ilike 'my_table%'
GROUP BY ros_id,node_name
ORDER BY ROS_SIZE_BYTES
LIMIT 20;
--  NumPartitions |      ros_id       |     node_name      | ROS_SIZE_BYTES | ROS_ROW_COUNT
-- ---------------+-------------------+--------------------+----------------+---------------
--              1 | 54043195528615460 | v_eon6vdb_node0003 |             99 |             1
--              1 | 54043195528615464 | v_eon6vdb_node0003 |             99 |             1
--  (2 rows)