性能比较:rs.last;rs.getRow(); 和select count(id) from table

drainbow 2008-08-21 11:58:16
取数据总条数,哪个效率更高、性能更好:
方法1:
String sql = "select * from tablename";
rs = stmt.executeQuery(sql);
rs.last();
int count = rs.getRow();
rs.beforFirst();

while(rs.next) {
//执行后续操作
}


方法2:
String sql = "select count(id) from tablename";
rs = stmt.executeQuery(sql);
int count = rs.getInt(1);

sql = "select * from tablename";
rs = stmt.executeQuery(sql);
while(rs.next) {
//执行后续操作
}

两个SQL的条件都是一样的,只是方法1是在程序里用rs.last()取出rs.getRow(),方法2由数据库自己算出来,但方法1的查询结果还要进行处理,而方法2没有这个结果集,要再执行一次select操作。
那么省出来的一次数据查询能抵得上rs.last()操作的效率吗?

或者在某个临界点方法1比方法2快,而过了临界点就反一下
...全文
356 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
tidelgl 2008-11-25
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 drainbow 的回复:]
[Quote=引用 5 楼 shengli_liao 的回复:]
对于这两种方法我都比较排斥
方法一需要对游标动态操作,资源浪费,性能下降
方法二查询两遍,如果条件特别麻烦导致效率下降
我一般是用的方法是:
方法三:

Java code

String sql = "select * from tablename";
rs = stmt.executeQuery(sql);
ArrayList list = new ArrayList();
while(rs.next) {
list.add(rs.getXXX());
}
int count = list.size(…
[/Quote]

看法是你应该定义两个SQL,另一个SQL把TOP去掉..
tidelgl 2008-11-25
  • 打赏
  • 举报
回复
8楼为何出此言?
xzj127 2008-09-28
  • 打赏
  • 举报
回复
愚蠢的讨论
harryzyp 2008-08-22
  • 打赏
  • 举报
回复
呵呵,楼上的绝.
shengli_liao 2008-08-22
  • 打赏
  • 举报
回复
对于这两种方法我都比较排斥
方法一需要对游标动态操作,资源浪费,性能下降
方法二查询两遍,如果条件特别麻烦导致效率下降
我一般是用的方法是:
方法三:

String sql = "select * from tablename";
rs = stmt.executeQuery(sql);
ArrayList list = new ArrayList();
while(rs.next) {
list.add(rs.getXXX());
}
int count = list.size();
return list;

little06 2008-08-22
  • 打赏
  • 举报
回复
方法二效率高

原因是 方法一在应用层,即java那里做计算行数的操作,需要大量的内存

方法二在数据层就已经做了 计算行数的操作,因为数据在存储的时候已经做了优化,所以。。。。

可以试一试千万级数据量的时候 ,方法一和方法二的差别
feng8008 2008-08-22
  • 打赏
  • 举报
回复
测试一下用时不就知道了吗
  • 打赏
  • 举报
回复
当然是方法二效率高
吴冬冬 2008-08-22
  • 打赏
  • 举报
回复
考虑到网络资源的消耗
远程数据库的话方法一快些
本地数据库的话方法二快些
drainbow 2008-08-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 shengli_liao 的回复:]
对于这两种方法我都比较排斥
方法一需要对游标动态操作,资源浪费,性能下降
方法二查询两遍,如果条件特别麻烦导致效率下降
我一般是用的方法是:
方法三:



String sql = "select * from tablename";
rs = stmt.executeQuery(sql);
ArrayList list = new ArrayList();
while(rs.next) {
list.add(rs.getXXX());
}
int count = list.size();
return list;

[/Quote]

实际上后续操作要的不是所有数据

String sql = "select count(id) from tablename";
rs = stmt.executeQuery(sql);
int count = rs.getInt(1);

//分页,每页20条,第5页
sql = "select top 20 * from tablename where id in (select top 100 id from tablename)";
rs = stmt.executeQuery(sql);
while(rs.next) {
//执行后续操作
}

在页面上显示总记录数,最后的页码

不知还有其他看法没

67,516

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧