为什么 Quartz 2.* 不清理 Postgres 数据库中的索引?
Why Quartz 2.* does not cleanup indexes in Postgres database?
我在集群模式下使用 Quartz 2.*。 Quartz 使用 Postgres 数据库来实现集群功能。数据库大小随着 Java 应用程序的运行而增长。这种增长的唯一原因是 Quartz 没有清理它在表上的索引:
quartz.qrtz_triggers
quartz.qrtz_cron_triggers
quartz.qrtz_fired_triggers
quartz.qrtz_scheduler_state
应用程序运行一周会使数据库增加约 500 MiB。我有 5 个使用 Quartz 的微服务,所以整个数据库每周增长 5*500 MiB。
那我需要手动执行:
REINDEX TABLE quartz.qrtz_cron_triggers;
REINDEX TABLE quartz.qrtz_fired_triggers;
REINDEX TABLE quartz.qrtz_triggers;
REINDEX TABLE quartz.qrtz_scheduler_state;
之后数据库的大小就足够了。
正常吗?
如何配置 Quartz/Postgres 以自动清理它的内容?
虽然没有使用 quartz/postgres 组合的经验,但这似乎是一个索引碎片问题。
即当 table 行被重复更新或删除时,索引大小会增加并且性能会受到影响。如果您的 quartz 作业 运行 在集群数据库中创建相应数量的条目时,可能会出现这种情况。
重新索引数据库 tables(一个常见的维护过程)刷新索引并可能减少索引大小。
我建议创建一个数据库作业 运行 定期重新索引命令,根据我的发现,这可以使用 pg_cron 或 pgAdmin 工具来完成。
您还会在 PostgreSQL Wiki 中找到一些关于索引 size/usage 和索引膨胀的有用查询:
我在集群模式下使用 Quartz 2.*。 Quartz 使用 Postgres 数据库来实现集群功能。数据库大小随着 Java 应用程序的运行而增长。这种增长的唯一原因是 Quartz 没有清理它在表上的索引:
quartz.qrtz_triggers
quartz.qrtz_cron_triggers
quartz.qrtz_fired_triggers
quartz.qrtz_scheduler_state
应用程序运行一周会使数据库增加约 500 MiB。我有 5 个使用 Quartz 的微服务,所以整个数据库每周增长 5*500 MiB。
那我需要手动执行:
REINDEX TABLE quartz.qrtz_cron_triggers;
REINDEX TABLE quartz.qrtz_fired_triggers;
REINDEX TABLE quartz.qrtz_triggers;
REINDEX TABLE quartz.qrtz_scheduler_state;
之后数据库的大小就足够了。
正常吗?
如何配置 Quartz/Postgres 以自动清理它的内容?
虽然没有使用 quartz/postgres 组合的经验,但这似乎是一个索引碎片问题。
即当 table 行被重复更新或删除时,索引大小会增加并且性能会受到影响。如果您的 quartz 作业 运行 在集群数据库中创建相应数量的条目时,可能会出现这种情况。
重新索引数据库 tables(一个常见的维护过程)刷新索引并可能减少索引大小。 我建议创建一个数据库作业 运行 定期重新索引命令,根据我的发现,这可以使用 pg_cron 或 pgAdmin 工具来完成。
您还会在 PostgreSQL Wiki 中找到一些关于索引 size/usage 和索引膨胀的有用查询: