【【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’快

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

...全文
320 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分别测试的,不是放在一起跑
@井九 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
  • 打赏
  • 举报
回复
居然没人回复???
内容概要:本文详细介绍了基于Matlab实现的“梯级水光互补系统最大化可消纳电量期望短期优化调度模型”,属于电力系统领域高水平科研成果的复现(EI级别)。该模型聚焦于梯级水电站与光伏发电系统的协同优化调度,通过构建短期优化调度框架,旨在提升可再生能源的电量消纳能力并最大化系统综合效益。研究采用先进的数学优化方法对水光资源进行联合调度,充分考虑了光伏出力的不确定性、水资源约束、系统运行边界条件及电力平衡要求,实现了在多重约束下的电量期望最大化目标。模型不仅具备严谨的理论基础,还具有良好的工程应用前景,适用于新能源高比例渗透背景下电力系统的优化调度研究与实践。; 适合人群:具备电力系统分析、可再生能源利用或优化建模背景的研究生、科研人员及工程技术人员,特别适合致力于复现高水平学术论文(EI/顶刊)研究成果的学习者与开发者。; 使用场景及目标:① 学习并掌握梯级水电与光伏系统协同调度的建模思路与关键技术;② 熟悉基于Matlab的混合整数线性规划(MILP)或其他非线性优化方法在能源系统中的实际应用;③ 提升在新能源消纳、短期调度优化等方向的科研建模能力与代码实现水平,支持二次开发与创新研究。; 阅读建议:建议结合Matlab代码与优化理论同步研读,重点理解目标函数的设计逻辑、各类物理与运行约束的数学表达以及求解器的调用流程,推荐使用YALMIP等建模工具辅助实现,以提高模型构建效率与可读性,便于深入理解与后续拓展。

62,621

社区成员

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

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