我可以调用SELECT * FROM MyTable而不是SELECT TOP 100 * FROM MyTable ORDER BY id ASC OFFSET 0;调用,只是resultSet.next()根据需要调用来获取结果,并在程序级别处理它们,还是结果已经在内存中而不是放入TOP是不好的?
取决于数据库引擎和 JDBC 驱动程序。通常,JDBC API 背后的想法是数据库引擎创建一个游标(这也是为什么 ResultSet 是必须关闭的资源的原因),因此,您可以在SELECT * FROM someTableWithBillionsOfRows没有 a 的情况下执行 a LIMIT,但它可以很快。是否真的如此,好吧,这取决于。根据我的经验,它主要与 postgres 交互,它很快(例如,基于游标的数据从 DB 到 VM 的传输有限,即使查询匹配数十亿行),因此你的计划(无限制选择,继续调用接下来直到你有你想要的然后关闭结果集)应该可以正常工作。NB:一些数据库引擎半途而废并批量传输结果,两全其美:延迟开销是有限的(单个延迟开销由批量结果共享),但 DB 和 VM 之间的总传输仅限于rowsize 乘以 batchsize,即使您只读取一行然后关闭结果集。