java - 如何优化 SELECT DISTINCT sql 的分页?

标签 java sql spring postgresql spring-batch

我的查询是一个非常大的数据库上的不同选择,在 pgAdmin sql 工具中,查询本身持续 12 秒。

SELECT DISTINCT ON (city, airport, zip, country, name) city, airport, price, id FROM mytable;

spring-batch reader定义:

JpaPagingItemReader<MyEntity> reader;
reader.setPageSize(PAGE_SIZE);

如果我将 PAGE_SIZE 定义为与数据库列一样大,则性能等于 12 秒。 但如果我将大小设置为较低的值(例如,在 1.000.000 个数据行数据库上将 pagesize = 100.000),性能会非常差(大约长 10 倍)。

Spring-batch 在后台对查询应用特定的分页。它的作用是什么:

query.setFirstResult();
query.setMaxResult();

如果页面大小为10,则执行的查询如下:

    firstResult, maxResult
    0, 10
   10, 10
   20, 10
   30, 10...

这再次转换为 SQL 中的 LIMITOFFSET

问题:SELECT DISTINCT ON 不能与分页 LIMIT/OFFSET 结合使用吗?对我来说,好像在每次“分页”运行时再次执行完整的选择不同查询,因此持续很长时间。

那么,如果数据库必须在应用 maxresults 之前进行完整的不同选择,我可以临时保存“不同”选择并只获取下一页吗?

如何改进这一点,而不必将分页大小设置为 100 万。或者这里不可能改进?

最佳答案

如果您不使用多个线程来处理此问题,则另一种方法是使用 JdbcCusorItemReader。这样您就根本不需要优化查询的分页方面。如果您使用多线程,则这不是一个选项。

关于java - 如何优化 SELECT DISTINCT sql 的分页?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25932089/

相关文章:

java - 如何在 Spring WebFlow2 中检查日期格式

spring - 在 Spring Boot Rest 中检索查询参数的正确方法?

java - 父子线程同步(子线程 "on monitor")

java - 多个应用程序的单个 logback.xml 文件是一个好习惯吗?

sql - ORDER BY 与 HAVING 子句一起使用时出错

sql 查询将行中的值插入到列中

java - 老一代内存使用量的增长总是意味着 Java 中的内存泄漏?

java - JSOUP 向表单提交 POST

sql - 如果一个不相关的子查询在查询中的几个地方重复出现,是否可以缓存它并重用结果?

java - "object references an unsaved transient instance"双向一对一