我有一个使用Postgres数据库的Spring Boot应用程序。部署应用程序时,我需要运行一个事务操作,上传用于填充数据库的zip文件。应用程序在插入之前检查重复的行(因为用户可以上载应该被忽略的重复数据)。
我遇到的问题是,我第一次上传文件时,即使创建了索引,在检查行是否存在时也没有使用它们。我的理论是,这是因为查询计划决定不使用索引,因为它正在检查原始统计信息,这表明这些表是空的。如果我先上传一个小的zip文件,那么问题就会消失,因为这些表现在有数据。
我有两个问题。首先,我的理论是正确的,还是有其他原因导致这种行为?另外,如果是这样,有没有办法强制Postgres在同一事务中以某个预定义的时间间隔更新它使用的查询计划,这可以使用JPA完成吗?任何想法都表示赞赏。
答案 0 :(得分:0)
万一有人遇到这个问题,我会发布我找到的解决方案。看来我的理论是正确的。在收集一些统计信息之前,查询不会使用索引。强制执行此操作的一种方法是在将多个行写入数据库后调用ANALYZE。您可以使用以下本机查询执行此操作:
entityManager.createNativeQuery("ANALYZE " + tbl).executeUpdate();
您可以将此调用包装在try catch中,并忽略在更改数据库引擎时可能发生的任何异常。我无法以与数据库无关的方式找到这种方法,但这种方法运行正常,现在初始上传按预期执行。