【【sql同、prepareStatement怎么比createStatement慢了几百倍??】】

jidan023 2010-04-27 09:25:25
两个一样的sql
SELECT period,idCnt FROM MyTb WHERE
((idCnt - 1) IN (SELECT idCnt FROM MyTb WHERE name ='book' AND idCnt>=44905)) AND idCnt>=44905

SELECT period,idCnt FROM MyTb WHERE
((idCnt - 1) IN (SELECT idCnt FROM MyTb WHERE name =
(SELECT name FROM MyTb WHERE
idCnt =(SELECT MAX(idCnt) FROM MyTb ))) AND idCnt>=44905) AND idCnt>=44905

如上(SELECT name FROM MyTb WHEREidCnt =(SELECT MAX(idCnt) FROM MyTb ))这个实际上就是name ='book'
测试程序---------
long start=System.currentTimeMillis(); //获取最初时间
stmt = dbConn.prepareStatement(sql);
rs=stmt.executeQuery();
long end=System.currentTimeMillis(); //获取运行结束时间
out.print(end-start)+"ms");
rs.close();
stmt.close();

测试结果:
我在本地测试的、数据库SqlServer2000,数据总量47000条,两条sql执行结果一样
前者直接写name ='book' 的耗时29547ms
而后者只有436ms,按理说应该直接写name ='book' 的快些呀。

另外--------------
stmt = dbConn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
rs=stmt.executeQuery(sql);
用上面的替代stmt = dbConn.prepareStatement(sql);
居然两者的执行时间就差不多了,而且达到了正常的直接写name=‘book’快

大家分析下,什么原因啊 ???

...全文
268 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
jidan023 2010-04-27
  • 打赏
  • 举报
回复
最关键的是把stmt = dbConn.prepareStatement(sql)改为
stmt = dbConn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
rs=stmt.executeQuery(sql);
则达到了预计的效果
jidan023 2010-04-27
  • 打赏
  • 举报
回复
没有解决问题,程序逻辑没问题,就是专门做来测试的,没有任何业务逻辑
只是两个sql执行时间的测试。两个sql执行结果是一样的,都仅查出3条一样的数据
xxgcxyweijun 2010-04-27
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xxgcxyweijun 的回复:]

Statement没有设置缓存,prepareStatement有,并且一次性可以插入n个数据

利用PreparedStatement对象提高数据库的总体效率
  在使用PreparedStatement对象执行SQL命令时,命令被数据库进行解析和编译,然后被放到命令缓冲区。然后,每当执行同一个 PreparedStatement对象时,它就会被再解析一次,但不会被再次……
[/Quote]

Statement ─ 由方法 createStatement 所创建。Statement 对象用于发送简单的 SQL 语句。 
PreparedStatement ─ 由方法 prepareStatement 所创建。
xxgcxyweijun 2010-04-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ivorytower 的回复:]

慢几百倍?不可能吧。。要不就是你逻辑写错了,出了迪卡积了,或者在子查询里中数据的比较费时间
[/Quote]

补充 :
Statement ─ 由方法 createStatement 所创建。Statement 对象用于发送简单的 SQL 语句。 
PreparedStatement ─ 由方法 prepareStatement 所创建。
xxgcxyweijun 2010-04-27
  • 打赏
  • 举报
回复
Statement没有设置缓存,prepareStatement有,并且一次性可以插入n个数据

利用PreparedStatement对象提高数据库的总体效率
  在使用PreparedStatement对象执行SQL命令时,命令被数据库进行解析和编译,然后被放到命令缓冲区。然后,每当执行同一个 PreparedStatement对象时,它就会被再解析一次,但不会被再次编译。在缓冲区中可以发现预编译的命令,并且可以重新使用。在有大量用户的企业级应用软件中,经常会重复执行相同的SQL命令,使用PreparedStatement对象带来的编译次数的减少能够提高数据库的总体性能。如果不是在客户端创建、预备、执行PreparedStatement任务需要的时间长于Statement任务,我会建议在除动态SQL命令之外的所有情况下使用PreparedStatement对象


不知到这样解释能不能解决楼主的疑惑 ..
  • 打赏
  • 举报
回复
慢几百倍?不可能吧。。要不就是你逻辑写错了,出了迪卡积了,或者在子查询里中数据的比较费时间
So_So 2010-04-27
  • 打赏
  • 举报
回复
SELECT name FROM MyTb WHERE
idCnt =(SELECT MAX(idCnt) FROM MyTb 此处用到了 MAX函数 查询应该更快些 name='book'

也要去遍历啊 这个估计数据库 就是一个排序 就拿出来了.


jidan023 2010-04-27
  • 打赏
  • 举报
回复
不是什么顺序的问题,两个sql分别测试的,不是放在一起跑
problc 2010-04-27
  • 打赏
  • 举报
回复
几百倍?
是不是顺序的问题啊.
先执行这句试试
SELECT period,idCnt FROM MyTb WHERE
((idCnt - 1) IN (SELECT idCnt FROM MyTb WHERE name =
(SELECT name FROM MyTb WHERE
idCnt =(SELECT MAX(idCnt) FROM MyTb ))) AND idCnt>=44905) AND idCnt>=44905
sun88sz 2010-04-27
  • 打赏
  • 举报
回复
友情帮顶
jidan023 2010-04-27
  • 打赏
  • 举报
回复
居然没人回复???

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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