How to delete the oldest partition?
mosheg
Vertica Employee Administrator
When you need to drop the oldest partition consider the following example:
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;
WITH my_list AS
(SELECT max(order_date) as oldest from public.my_table)
SELECT date(order_date),
CASE WHEN order_date = oldest THEN 'Will be droped' ELSE 'Will keep' END as Status
FROM public.my_table, my_list ORDER BY 1;
-- Option A:
\set OLDEST `vsql -XAtc "SELECT max(order_date)::date from public.my_table;"`
\set OLDEST '''':OLDEST''''
SELECT DROP_PARTITIONS ('my_table', :OLDEST, :OLDEST);
SELECT DATE(order_date) FROM public.my_table ORDER BY 1;
-- Option B:
WITH my_list AS
(SELECT max(order_date) as oldest from public.my_table)
SELECT date(order_date),
CASE WHEN order_date = oldest THEN 'Will be droped' ELSE 'Will keep' END as Status
FROM public.my_table, my_list ORDER BY 1;
CREATE OR REPLACE FUNCTION my_drop(d2d DATE) RETURN VARCHAR(100)
AS BEGIN
RETURN 'SELECT DROP_PARTITIONS (''my_table'', ''' || d2d || ''' , ''' || d2d || ''');';
END;
\t
\o | vsql
SELECT my_drop((SELECT max(order_date)::DATE from public.my_table));
\o
\t
SELECT DATE(order_date) FROM public.my_table ORDER BY 1;
Here is the run time output:
CREATE TABLE public.my_table
(
order_no int,
order_date timestamp NOT NULL,
shipper varchar(20),
ship_date date
)
PARTITION BY DATE(order_date);
CREATE TABLE
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() + 10 - 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;
OUTPUT
--------
10
(1 row)
COMMIT;
COMMIT
WITH my_list AS
(SELECT max(order_date) as oldest from public.my_table)
SELECT date(order_date),
CASE WHEN order_date = oldest THEN 'Will be droped' ELSE 'Will keep' END as Status
FROM public.my_table, my_list ORDER BY 1;
date | Status
------------+----------------
2020-05-01 | Will keep
2020-05-02 | Will keep
2020-05-06 | Will keep
2020-05-07 | Will keep
2020-05-07 | Will keep
2020-05-10 | Will keep
2020-05-13 | Will keep
2020-05-20 | Will keep
2020-05-22 | Will keep
2020-05-24 | Will be droped
(10 rows)
SELECT DROP_PARTITIONS ('my_table', '2020-05-24', '2020-05-24');
DROP_PARTITIONS
-------------------
Partition dropped
(1 row)
SELECT DATE(order_date) FROM public.my_table ORDER BY 1;
DATE
------------
2020-05-01
2020-05-02
2020-05-06
2020-05-07
2020-05-07
2020-05-10
2020-05-13
2020-05-20
2020-05-22
(9 rows)
WITH my_list AS
(SELECT max(order_date) as oldest from public.my_table)
SELECT date(order_date),
CASE WHEN order_date = oldest THEN 'Will be droped' ELSE 'Will keep' END as Status
FROM public.my_table, my_list ORDER BY 1;
date | Status
------------+----------------
2020-05-01 | Will keep
2020-05-02 | Will keep
2020-05-06 | Will keep
2020-05-07 | Will keep
2020-05-07 | Will keep
2020-05-10 | Will keep
2020-05-13 | Will keep
2020-05-20 | Will keep
2020-05-22 | Will be droped
(9 rows)
CREATE OR REPLACE FUNCTION my_drop(d2d DATE) RETURN VARCHAR(100)
AS BEGIN
RETURN 'SELECT DROP_PARTITIONS (''my_table'', ''' || d2d || ''' , ''' || d2d || ''');';
END;
CREATE FUNCTION
Showing only tuples.
SELECT my_drop((SELECT max(order_date)::DATE from public.my_table));
DROP_PARTITIONS
-------------------
Partition dropped
(1 row)
Tuples only is off.
SELECT DATE(order_date) FROM public.my_table ORDER BY 1;
DATE
------------
2020-05-01
2020-05-02
2020-05-06
2020-05-07
2020-05-07
2020-05-10
2020-05-13
2020-05-20
(8 rows)
1
Answers
That's really helpful! Thanks