我有一个linux centos系统,并且正在使用postgres PostgreSQL 9.4.11数据库。
我有一个消息系统,其中消息存储在db中,并且收据被插入到具有更新状态的同一个表中(因此对于1个消息,表中添加了3行),每天有数百万行插入其中由于该表生成报告需要花费很多时间。我无法控制该表,使其将更新后的状态存储在同一行中。
我尝试过数据表分区来改进它,但它没那么有用。
所以为了解决这个问题,我开始将发送的消息存储在两个表中,当我收到收据时,我更新第二个表同一行并从中生成报告。为了做到这一点,我尝试使用触发器,但触发器非常慢,更新100k行,大约需要12个小时。
我尝试的第三个选项是我在java中创建了一个调度程序,它从大表中查询100条记录,并通过正确的id更新新表中的记录。 一个接一个地执行此操作根本不高效,因为它会增加服务器负载并且需要时间来更新数据。
我尝试了以下批量更新方法,一次更新所有收据: 我在数组中添加了所有id并设置了所需的状态和时间并执行了更新,但这不起作用,arrids数组显示1000条记录,更新计数仅显示更新的20或50条记录(显示一些随机计数)。 / p>
queryStm = "Update reciept set smsc_sub=:dlr,time_sub=:time,serverTime=:servertime where id IN :arrids ";
Query query = em.createNativeQuery(queryStm);
query.setParameter("arrids ",arrids );
query.setParameter("dlr", dlr);
query.setParameter("time", time);
query.setParameter("servertime", new Timestamp(new Date().getTime()));
query.executeUpdate();
是否有任何有效的方法可以在java / jpa或postgres中将数据从另一个表更新到一个表中。