setmaxrows的优点是您可以创建在Postgres,Oracle,Mysql等中有效的通用语句由于Oracle使用rownum语法,因此postgres-限制,msqsql-顶部
在速度上似乎没有什么区别。
[在大多数情况下,您想使用Statement.setMaxRows()
子句,但最终,两者都会实现您想要的。此答案针对JDBC和PostgreSQL,但适用于使用类似模型的其他语言和数据库。
LIMIT
的JDBC文档说
如果超出限制,多余的行将被静默删除。
即数据库服务器可能会返回更多行,但是客户端只会忽略它们。客户端和服务器端的PostgreSQL JDBC驱动程序限制。对于客户端,请查看Statement.setMaxRows
的用法。对于服务器端,请查看Statement.setMaxRows
。
服务器端,maxRows
in the AbstractJdbc2ResultSet
说:
查询优化器在生成查询时会考虑LIMIT计划
只要查询明智,它将仅加载完成查询所需的数据。
setFetchSize当此Statement生成的ResultSet对象需要更多行时,为JDBC驱动程序提供有关应从数据库获取的行数的提示。
setMaxRows将此Statement对象生成的任何ResultSet对象可以包含的最大行数限制为给定数目。
我想使用上述2种JDBC API,您可以通过使用setFetchSize来尝试,如果可以用于100K记录,则可以尝试。否则,您可以批量获取并形成ArrayList并将其返回到Jasper报告中。
不确定我是否正确,但是我记得在过去,我参与了一个大型项目,将所有希望返回一行的查询更改为'TOP 1'或numrows = 1。原因是使用此“提示”时,数据库将停止搜索“下一个可能的匹配项”。在大批量环境中,这确实有所作为。仅可以“忽略”客户端或结果集中的多余记录的说法还不够。您应尽早避免不必要的读取。但是我不知道JDBC方法是否将那些特定于数据库的提示添加到查询y / n中。我可能需要测试才能看到和使用它...我不是数据库专家,可以想象我是不对的,但是“ Speedwise好像没什么区别”可能是错误的假设。如果要求您在框内搜索红球,而您只需要一个,则不会增加价值,而是继续搜索所有适合您的位置...那么指定“ TOP 1”很重要... ...>