Postgresql Postgres中Spring批处理表的清理策略
Spring批处理框架定义 它们将索引定义留给最终用户,窗帘式查询无法通过设计避免完全扫描。因此,性能要求对桌子进行瘦身 我们不需要将历史批次数据保存超过1周 我不能为Postgres想出一个不需要停止所有批处理过程的拒绝策略 如果很容易停止批处理作业,那么我可以截断或删除批处理表。这需要在数据库维护和批处理作业维护之间进行协调 我考虑在批处理作业执行的基础上删除数据。创建时间<当前日期-7以及相应的联接。应特别注意通过真空回收已用内存。据我所知,如果没有真空满锁但满锁的批处理表,回收表存储是不可能的。这会阻止批处理 更新我当前的清理计划是以单位+秒为单位的性能统计:Postgresql Postgres中Spring批处理表的清理策略,postgresql,spring-batch,Postgresql,Spring Batch,Spring批处理框架定义 它们将索引定义留给最终用户,窗帘式查询无法通过设计避免完全扫描。因此,性能要求对桌子进行瘦身 我们不需要将历史批次数据保存超过1周 我不能为Postgres想出一个不需要停止所有批处理过程的拒绝策略 如果很容易停止批处理作业,那么我可以截断或删除批处理表。这需要在数据库维护和批处理作业维护之间进行协调 我考虑在批处理作业执行的基础上删除数据。创建时间
-- 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;
可能是重复的。。。。再次发布相同的答案,希望这有帮助 我已经为此奋斗了一段时间,但是没有标准的实现 然后我想出了一个我自己的存储过程 我已经创建了自己的变量-用于在六个月之前清除最近六个月的数据 你可以利用自己的价值
Spring批处理元数据表清除的可能重复项。请参阅我省略了选择不同的作业\u实例\u ID批量收集到并使用not exists来清理批处理作业\u实例。您没有提到DB flavor。我怀疑是MSSQL。我的问题在细节上有所不同。就像我在基于BATCH_STEP_EXECUTION.START_TIME进行删除时没有加入BATCH_JOB_执行,尽管我稍后会这样做。这是因为BATCH_STEP_EXECUTION是我们使用的最臃肿的表。这里的DB是Oracle,大多数情况下,您会发现不同数据库中的批处理表结构相似,为了清理这些表,我遵循了Spring提供的元数据模型,您可以在这里查看模型图-