【发布时间】:2019-10-29 03:05:03
【问题描述】:
我需要从具有超过 2 亿条记录的 Postgres SQL 表中删除记录。该表没有任何主键。
示例表(书签为表名)内容如下:
systemId filename mindatetime maxdatetime
70277 monitor_1.dat 2019-04-21 08:00:00 AM 2019-04-21 03:10:00 PM
10006 monitor_2.dat 2019-04-25 10:00:00 AM 2019-04-25 11:30:00 AM
10006 monitor_3.dat 2019-04-28 08:00:00 AM 2019-04-28 10:00:00 AM
10006 monitor_3.dat 2019-04-28 09:00:00 AM 2019-04-28 11:00:00 AM
10006 monitor_3.dat 2019-04-28 07:00:00 AM 2019-04-28 04:00:00 PM
8368 monitor_1.dat 2019-05-21 11:00:00 AM 2019-05-21 11:30:00 AM
8368 monitor_7.dat 2019-05-21 06:00:00 AM 2019-05-21 11:00:00 AM
8368 monitor_5.dat 2019-05-23 08:00:00 AM 2019-05-23 10:00:00 AM
72777 monitor_4.dat 2019-04-28 09:00:00 AM 2019-04-29 11:00:00 AM
72777 monitor_4.dat 2019-04-28 11:00:00 AM 2019-04-29 18:00:00 PM
72777 monitor_4.dat 2019-04-28 09:30:00 AM 2019-04-29 23:00:00 PM
12345 monitor_5.dat 2019-04-28 07:00:00 AM 2019-04-28 10:00:00 AM
12345 monitor_5.dat 2019-04-28 02:00:00 PM 2019-04-28 06:00:00 PM
12345 monitor_5.dat 2019-04-28 09:00:00 AM 2019-04-28 03:00:00 PM
10006 monitor_8.dat 2019-04-28 09:00:00 AM 2019-04-29 09:00:00 AM
10006 monitor_8.dat 2019-04-29 09:01:00 AM 2019-04-30 10:00:00 AM
10006 monitor_8.dat 2019-04-30 10:01:00 AM 2019-04-30 11:00:00 AM
10006 monitor_8.dat 2019-05-12 07:00:10.001 AM 2019-05-13 10:00:10.000 AM
10006 monitor_8.dat 2019-05-15 09:30:10.001 AM 2019-05-18 11:30:10.000 AM
cron 作业应该按照给定的时间表运行,以删除逻辑上冗余的记录。
为了解释这一点,让我们以 systemId '10006' 为例,其中文件名为 'monitor_3.dat' 有 3 个条目,最小和最大日期时间戳为同一天。
从逻辑上讲,我们可以删除具有 mindatetime 08:00:00 AM 和 09:00:00 AM、maxdatetime 10:00:00 AM、11:00:00 AM 的条目,因为该间隔被另一个条目覆盖mindatetime 为上午 7 点,maxdatetime 为下午 4 点。
因此,这些条目将落在此间隔内,作业应在整个表中识别此类条目并将其删除。
在这种情况下我的结果输出表内容应该是:
systemId filename mindatetime maxdatetime
70277 monitor_1.dat 2019-04-21 08:00:00 AM 2019-04-21 03:10:00 PM
10006 monitor_2.dat 2019-04-25 10:00:00 AM 2019-04-25 11:30:00 AM
10006 monitor_3.dat 2019-04-28 07:00:00 AM 2019-04-28 04:00:00 PM
8368 monitor_1.dat 2019-05-21 11:00:00 AM 2019-05-21 11:30:00 AM
8368 monitor_7.dat 2019-05-21 06:00:00 AM 2019-05-21 11:00:00 AM
8368 monitor_5.dat 2019-05-23 08:00:00 AM 2019-05-23 10:00:00 AM
72777 monitor_4.dat 2019-04-28 09:00:00 AM 2019-04-29 23:00:00 PM
12345 monitor_5.dat 2019-04-28 07:00:00 AM 2019-04-28 06:00:00 PM
10006 monitor_8.dat 2019-04-28 09:00:00 AM 2019-04-30 11:00:00 AM
10006 monitor_8.dat 2019-05-12 07:00:10.001 AM 2019-05-13 10:00:10.000 AM
10006 monitor_8.dat 2019-05-15 09:30:10.001 AM 2019-05-18 11:30:10.000 AM
磁盘上的表大小超过 20Gb,所以我正在探索编写一个 sql 过程或作业来实现这一点,但没有取得太大进展。对于克服这种复杂情况有什么想法或建议吗?
【问题讨论】:
标签: java postgresql stored-procedures jdbc job-scheduling