如何在SELECT DISTINCT sql上优化分页?

时间:2014-09-19 10:42:40

标签: java sql spring postgresql spring-batch

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

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

弹簧批阅读器定义:

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之前数据库必须以任何方式进行完全不同的选择,我可以临时保存“distinct”选择并只获取下一页吗?

如何在不必将分页大小设置为100万的情况下改进这一点。或者这里不可能改进吗?

1 个答案:

答案 0 :(得分:1)

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