带有 Postgres 的 Spring Boot 应用程序 : indexes not being used during first use

标签 spring postgresql

我有一个使用 Postgres 数据库的 Spring Boot 应用程序。部署应用程序后,我需要运行一个事务性操作来上传一个用于填充数据库的 zip 文件。应用程序在插入重复行之前检查它们(因为用户可以上传应该忽略的重复数据)。

我遇到的问题是,我第一次上传文件时,即使创建了索引,在检查行是否存在时也没有使用它们。我的理论是,发生这种情况是因为查询计划决定不使用索引,因为它正在检查原始统计信息,这表明表是空的。如果我先上传一个小的 zip 文件,那么问题就会消失,因为表格现在有数据了。

我有两个问题。首先,我的理论是正确的还是有其他原因导致这种行为?另外,如果是这样,有没有办法强制 Postgres 在同一事务中以某个预定义的时间间隔更新它使用的查询计划,这可以使用 JPA 完成吗?任何想法表示赞赏。

最佳答案

以防万一有人遇到这个问题,我会发布我找到的解决方案。看来我的理论是正确的。在收集到一些统计信息之前,查询不会使用索引。强制执行此操作的一种方法是在将多行数据写入数据库后调用 ANALYZE。您可以使用这样的 native 查询来执行此操作:

entityManager.createNativeQuery("ANALYZE "+ tbl).executeUpdate();

您可以将此调用包装在 try catch 中,并忽略在更改数据库引擎时可能发生的任何异常。我找不到以独立于数据库的方式执行此操作的方法,但这种方法工作正常,现在初始上传按预期执行。

关于带有 Postgres 的 Spring Boot 应用程序 : indexes not being used during first use,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35076442/

相关文章:

服务或 Controller 中的 Spring DTO 验证?

java - 如何使用 Spring Boot Rest Controller 返回 JSONArray?

sql - 如何在 PostgreSQL 中有条件地查找模式

postgresql - 在postgresql中连接行

sql - 查询在 PostgreSQL 中有效,但在 HSQL 中失败。我该如何解决?

android - 如何在应用程序中使用api登录

java - 不同事务更新相同数据 Spring AOP 做脏更新

spring - 在 google app engine 上实现 spring security

java - Spring - Rest Controller 将 json 输入处理为空字符串

python - psycopg2 忽略多行插入时的重复键冲突