论坛首页 Java企业应用论坛

PreparedStatement一定会提高性能吗?

浏览 31676 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2004-06-28  
好文啊。
0 请登录后投票
   发表时间:2004-08-03  
不明白索引为什么反而会降低查询速度,什么时候应该使用索引呢?
0 请登录后投票
   发表时间:2004-08-04  
当你查询出来的结果命中率在20%以下,使用索引会加快速度!
0 请登录后投票
   发表时间:2004-08-05  
不错。:-) 有个连接,供参考。
http://www.javaperformancetuning.com/tips/jdbc_prepared.shtml
0 请登录后投票
   发表时间:2004-08-10  
agilejava 写道
经过网友的帮助,终于解决了这个问题,原因在于fee_terminal_id建立了索引,而oracle在执行查询时按照这个索引先找到所有的行,之后再查询这些记录,而符合fee_terminal_id的记录有100多万,导致了查询速度非常之慢,在我把这个索引删除之后查询速度在8-9秒之间,很快。因此索引有时会起到相反的作用,要小心使用:)
非常感谢大家的帮助,特别要感谢卜志明,是他的帮助和指导帮助我找到了问题。:)


fee_terminal_id是最后一个条件,oracle会因为它是索引而优先检索吗?还是PreparedStatement的优化过度?这样优化是不是太过于“智能”了吧,怎么防止这样的自动优化过度呀?就以这个例子来说,很多情况不可能都以删除索引来解决吧,因为其他地方需要使用索引呀。
0 请登录后投票
   发表时间:2004-08-10  
towjzhou 写道
很多情况下我是这样子的:

外层函数 call 内层函数
那个PreparedStatement是在内层里创建的,所以每调用一次内层函数都要重建一个PreparedStatement,这样内层的PreparedStatement创建起来只用了一次就被弃掉了,这样是不是不能起到Prepare的作用呢?还是只要是用Prepare过的,它会在服务器上缓存的。
  


weblogic的连接池就可以设置缓存PreparedStatement的个数,但不知道对性能有多大提高。个人认为,PreparedStatement更适合用在批处理的场合,一次性的还是用Statement比较好,我在使用中也发现PreparedStatement的性能比Statement差。

另外,我知道PreparedStatement如果不显式调用pstmt.close()而prepare另外一条SQL语句会造成PreparedStatement泄漏,不知道Statement是不是同样也存在这么一个问题?
0 请登录后投票
   发表时间:2004-08-10  
zzeric 写道
agilejava 写道
经过网友的帮助,终于解决了这个问题,原因在于fee_terminal_id建立了索引,而oracle在执行查询时按照这个索引先找到所有的行,之后再查询这些记录,而符合fee_terminal_id的记录有100多万,导致了查询速度非常之慢,在我把这个索引删除之后查询速度在8-9秒之间,很快。因此索引有时会起到相反的作用,要小心使用:)
非常感谢大家的帮助,特别要感谢卜志明,是他的帮助和指导帮助我找到了问题。:)


fee_terminal_id是最后一个条件,oracle会因为它是索引而优先检索吗?还是PreparedStatement的优化过度?这样优化是不是太过于“智能”了吧,怎么防止这样的自动优化过度呀?就以这个例子来说,很多情况不可能都以删除索引来解决吧,因为其他地方需要使用索引呀。


这个问题过去好久了,还有人讨论:)
按照我看到的Oracle执行计划,确实先按fee_terminal_id是索引,他才先按照fee_termianl_id来查的,至于有没有别的解决方法,我也不知道,因为我对oracle也不熟,所以找不到更好的解决办法,后来只好改用Statement来解决问题了。
0 请登录后投票
   发表时间:2004-08-10  
如果存在多个索引的话,Oracle还不能智能到优先选择最合适的索引,所以我怀疑是Oracle选择了不合适的索引造成的,而你删除一个索引恰好让它能选到正确的索引。
0 请登录后投票
   发表时间:2004-08-11  
当时的问题在于只存在那么一个索引:)
也许Oracle就选它了
0 请登录后投票
   发表时间:2004-08-19  
zhangrex 写道
我强烈反对大家目前书写PreparedStatment的风格,这是典型的人为电脑打工的例子。为什么不能写成
st.executeupdate("insert into 表 (字段1,字段2) values("+pre(值1)+","+pre(值2)+")");
由电脑(编译器)根据pre这三个字自动帮我们实现PreparedStaement?即第一次碰到pre语句时自动产生PreparedStatment,以后就可跳过。


要是你自己来写一套电脑(编译器)估计可以实现你的“第一次碰到pre语句时自动产生PreparedStatment,以后就可跳过”。

zhangrex 写道

难道写成
st=con.prepareStatment(INSERT INTO 表 (字段1,字段2) VALUES(?,?));
st.setXXX(1,值s[pos);
st.setXXX(2,值s[pos]);
st.executeUpdate;
大家不觉得影响开发效率吗?可读性也差。


当你碰到很长很长的,而且还是通过大量字符串连接而成的SQL,你才会知道什么叫可读性差。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics