Spring Batch framework defines several BATCH_
prefixed tables.
They leave index definitions to end-users and curtain queries can't avoid full scan by design. So performance requires slimming of tables.
We don't need to keep historical BATCH_*
data for more than 1 week.
I can't come up with rejection strategy for Postgres that doesn't require all our batch processes stopping.
If it is easy to stop Batch jobs then I can truncate
or drop
BATCH_*
tables. This require coordination between DB maintenance and Batch job maintenance.
I think about delete
data based on BATCH_JOB_EXECUTION.CREATE_TIME < current_date - 7
with corresponding joins. Special care should be taken to Postgres to reclaim used memory via vacuum
. As I understand it is impossible to reclaim table storage without vacuum full
but full
locks BATCH_
tables. This blocks Batch processes...
UPDATE My current cleanup plan is (with performance stats in units + seconds):
-- 2.1M 43s
-- Quick cleanup of majority of records.
DELETE FROM batch_step_execution_context bsec
WHERE
EXISTS (
SELECT 1 FROM batch_step_execution bse
WHERE bse.start_time < current_date - 22 and bsec.step_execution_id = bse.step_execution_id);
-- 2.5s
vacuum batch_step_execution_context;
-- 2.1M 40s
-- Quick cleanup of majority of records.
DELETE FROM batch_step_execution bse
WHERE bse.start_time < current_date - 22;
-- 59s
vacuum batch_step_execution;
-- 0 1.4s
-- Full cleanup.
DELETE FROM batch_step_execution_context bsec
WHERE
EXISTS (
SELECT 1 FROM batch_step_execution bse
join batch_job_execution bje on bje.job_execution_id = bse.job_execution_id
WHERE bje.start_time < current_date - 22 and bsec.step_execution_id = bse.step_execution_id);
-- 0 1.2s
-- Full cleanup.
DELETE FROM batch_step_execution bse
WHERE
EXISTS (
SELECT 1 FROM batch_job_execution bje
WHERE bje.start_time < current_date - 22 and bje.job_execution_id = bse.job_execution_id);
-- 122k .49s
DELETE FROM batch_job_execution_params bjep
WHERE
EXISTS (
SELECT 1 FROM batch_job_execution bje
WHERE bje.start_time < current_date - 22 and bje.job_execution_id = bjep.job_execution_id);
-- 1.2s
vacuum batch_job_execution_params;
-- 61k .31s
DELETE FROM batch_job_execution_context bjec
WHERE
EXISTS (
SELECT 1 FROM batch_job_execution bje
WHERE bje.start_time < current_date - 22 and bje.job_execution_id = bjec.job_execution_id);
-- .68s
vacuum batch_job_execution_context;
-- 61k 4.4s
DELETE FROM batch_job_execution bje
WHERE bje.start_time < current_date - 22;
-- .21s
vacuum batch_job_execution;
-- 61k 1.1s
DELETE FROM batch_job_instance bji
WHERE NOT EXISTS (SELECT 1 FROM batch_job_execution bje WHERE bje.job_instance_id = bji.job_instance_id);
-- .33s
vacuum batch_job_instance;