SQL LIMIT与JDBC语句setMaxRows。哪个更好?

问题描述 投票:7回答:5

我想为给定查询选择前10条记录。因此,我可以使用以下选项之一:

这两个选项的优缺点是什么?

java sql postgresql jdbc limit
5个回答
5
投票

setmaxrows的优点是您可以创建在Postgres,Oracle,Mysql等中有效的通用语句由于Oracle使用rownum语法,因此postgres-限制,msqsql-顶部

在速度上似乎没有什么区别。


4
投票

[在大多数情况下,您想使用Statement.setMaxRows()子句,但最终,两者都会实现您想要的。此答案针对JDBC和PostgreSQL,但适用于使用类似模型的其他语言和数据库。

LIMIT的JDBC文档说

如果超出限制,多余的行将被静默删除。

即数据库服务器可能会返回更多行,但是客户端只会忽略它们。客户端和服务器端的PostgreSQL JDBC驱动程序限制。对于客户端,请查看Statement.setMaxRows的用法。对于服务器端,请查看Statement.setMaxRows

服务器端,maxRows in the AbstractJdbc2ResultSet说:

查询优化器在生成查询时会考虑LIMIT计划

只要查询明智,它将仅加载完成查询所需的数据。


2
投票

setFetchSize当此Statement生成的ResultSet对象需要更多行时,为JDBC驱动程序提供有关应从数据库获取的行数的提示。

setMaxRows将此Statement对象生成的任何ResultSet对象可以包含的最大行数限制为给定数目。

我想使用上述2种JDBC API,您可以通过使用setFetchSize来尝试,如果可以用于100K记录,则可以尝试。否则,您可以批量获取并形成ArrayList并将其返回到Jasper报告中。


1
投票

不确定我是否正确,但是我记得在过去,我参与了一个大型项目,将所有希望返回一行的查询更改为'TOP 1'或numrows = 1。原因是使用此“提示”时,数据库将停止搜索“下一个可能的匹配项”。在大批量环境中,这确实有所作为。仅可以“忽略”客户端或结果集中的多余记录的说法还不够。您应尽早避免不必要的读取。但是我不知道JDBC方法是否将那些特定于数据库的提示添加到查询y / n中。我可能需要测试才能看到和使用它...我不是数据库专家,可以想象我是不对的,但是“ Speedwise好像没什么区别”可能是错误的假设。如果要求您在框内搜索红球,而您只需要一个,则不会增加价值,而是继续搜索所有适合您的位置...那么指定“ TOP 1”很重要... ...>


1
投票

SQL级限制

© www.soinside.com 2019 - 2024. All rights reserved.