精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2004-06-28
好文啊。
|
|
返回顶楼 | |
发表时间:2004-08-03
不明白索引为什么反而会降低查询速度,什么时候应该使用索引呢?
|
|
返回顶楼 | |
发表时间:2004-08-04
当你查询出来的结果命中率在20%以下,使用索引会加快速度!
|
|
返回顶楼 | |
发表时间:2004-08-05
不错。:-) 有个连接,供参考。
http://www.javaperformancetuning.com/tips/jdbc_prepared.shtml |
|
返回顶楼 | |
发表时间:2004-08-10
agilejava 写道 经过网友的帮助,终于解决了这个问题,原因在于fee_terminal_id建立了索引,而oracle在执行查询时按照这个索引先找到所有的行,之后再查询这些记录,而符合fee_terminal_id的记录有100多万,导致了查询速度非常之慢,在我把这个索引删除之后查询速度在8-9秒之间,很快。因此索引有时会起到相反的作用,要小心使用:)
非常感谢大家的帮助,特别要感谢卜志明,是他的帮助和指导帮助我找到了问题。:) fee_terminal_id是最后一个条件,oracle会因为它是索引而优先检索吗?还是PreparedStatement的优化过度?这样优化是不是太过于“智能”了吧,怎么防止这样的自动优化过度呀?就以这个例子来说,很多情况不可能都以删除索引来解决吧,因为其他地方需要使用索引呀。 |
|
返回顶楼 | |
发表时间:2004-08-10
towjzhou 写道 很多情况下我是这样子的:
外层函数 call 内层函数 那个PreparedStatement是在内层里创建的,所以每调用一次内层函数都要重建一个PreparedStatement,这样内层的PreparedStatement创建起来只用了一次就被弃掉了,这样是不是不能起到Prepare的作用呢?还是只要是用Prepare过的,它会在服务器上缓存的。 weblogic的连接池就可以设置缓存PreparedStatement的个数,但不知道对性能有多大提高。个人认为,PreparedStatement更适合用在批处理的场合,一次性的还是用Statement比较好,我在使用中也发现PreparedStatement的性能比Statement差。 另外,我知道PreparedStatement如果不显式调用pstmt.close()而prepare另外一条SQL语句会造成PreparedStatement泄漏,不知道Statement是不是同样也存在这么一个问题? |
|
返回顶楼 | |
发表时间: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来解决问题了。 |
|
返回顶楼 | |
发表时间:2004-08-10
如果存在多个索引的话,Oracle还不能智能到优先选择最合适的索引,所以我怀疑是Oracle选择了不合适的索引造成的,而你删除一个索引恰好让它能选到正确的索引。
|
|
返回顶楼 | |
发表时间:2004-08-11
当时的问题在于只存在那么一个索引:)
也许Oracle就选它了 |
|
返回顶楼 | |
发表时间: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,你才会知道什么叫可读性差。 |
|
返回顶楼 | |