Postgresql Postgres中Spring批处理表的清理策略

Postgresql Postgres中Spring批处理表的清理策略,postgresql,spring-batch,Postgresql,Spring Batch,Spring批处理框架定义 它们将索引定义留给最终用户,窗帘式查询无法通过设计避免完全扫描。因此,性能要求对桌子进行瘦身 我们不需要将历史批次数据保存超过1周 我不能为Postgres想出一个不需要停止所有批处理过程的拒绝策略 如果很容易停止批处理作业,那么我可以截断或删除批处理表。这需要在数据库维护和批处理作业维护之间进行协调 我考虑在批处理作业执行的基础上删除数据。创建时间

Spring批处理框架定义

它们将索引定义留给最终用户,窗帘式查询无法通过设计避免完全扫描。因此,性能要求对桌子进行瘦身

我们不需要将历史批次数据保存超过1周

我不能为Postgres想出一个不需要停止所有批处理过程的拒绝策略

如果很容易停止批处理作业,那么我可以截断或删除批处理表。这需要在数据库维护和批处理作业维护之间进行协调

我考虑在批处理作业执行的基础上删除数据。创建时间<当前日期-7以及相应的联接。应特别注意通过真空回收已用内存。据我所知,如果没有真空满锁但满锁的批处理表,回收表存储是不可能的。这会阻止批处理

更新我当前的清理计划是以单位+秒为单位的性能统计:

-- 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提供的元数据模型,您可以在这里查看模型图-