我的查询是一个非常大的数据库上的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中的LIMIT
和OFFSET
。
问题:SELECT DISTINCT ON
是否与分页LIMIT / OFFSET不可组合?对我来说,似乎在每次“分页”运行中再次执行完全选择的不同查询,因此持续很长时间。
因此,如果在应用maxresults之前数据库必须以任何方式进行完全不同的选择,我可以临时保存“distinct”选择并只获取下一页吗?
如何在不必将分页大小设置为100万的情况下改进这一点。或者这里不可能改进吗?
答案 0 :(得分:1)
如果您没有使用多个线程来处理此问题,则可以使用JdbcCusorItemReader
。这样,您根本不需要优化查询的分页方面。如果你使用多个线程,这不是一个选项。