请教个小问题

jjqxt 2011-05-23 09:34:19
学了数据库那么久,就使用到的就只是普通的DML,很少研究索引那些,最近工作的时候需要处理16万条数据,耗时好久,实际测试麻烦,加上近来公司内对数据库索引的讨论,于是研究SQL语句优化。

举例更新如下一条数据:


a091 a0901 a0902 a0903 a0904
1 1 2 3 4
主键是a091

更新语句如下:

update A09 SET a0901=2,a0902=1 WHERE a0903=3 and a0904=4

重复1000次 平均1条执行时间是21毫秒

update A09 SET a0901=2,a0902=1 WHERE a091=(select a091 from A09 where a0903=3 and a0904=4)

重复1000次 平均1条执行时间是13毫秒

大概知道是主键索引起了作用,求达人解释下原理?是因为select 的where 比update 的 where 查询得快么?

还有我用实际的数据测试 反而是有子查询的耗时多了,这又是为什么?(之前看到个网摘,说ORACLE会缓存执行过的SQL语句,就是说重复两条一样的语句,会快点,是否是因为这个原因?)
...全文
95 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
siegebaoniu 2011-05-25
  • 打赏
  • 举报
回复
当然是有子查询的慢咯。
不要悲剧人生 2011-05-25
  • 打赏
  • 举报
回复
看执行计划不一样。
jjqxt 2011-05-25
  • 打赏
  • 举报
回复
补充下:测试是用JAVA 的JDBC 测executeUpdate()这个函数的花费时间,SQL字符串使用的是直接串 不用?的方式
fitzanepeng1 2011-05-25
  • 打赏
  • 举报
回复
学习了
wantenliang 2011-05-25
  • 打赏
  • 举报
回复
工作的规定
RRRR100 2011-05-25
  • 打赏
  • 举报
回复
我遇到的情况都是嵌套查询慢点,继续关注。。。。。。
jjqxt 2011-05-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 tangren 的回复:]
一行数据update是不能说明问题的。
如果大量数据,第2条语句更慢是确定的,
原因是:第一个语句只是针对a09表进行一次全扫描,然后更新就行了。
而第二个语句,子查询要进行一次与第一个语句一样的全表扫描,而且还要进行一次索引唯一扫描。
多出读索引块的操作,如果一个唯一索引扫描进行两次I/O,那么,1000次update,将多出2000次
一致读,这样累计消耗资源就比较明显了。
[/Quote]
今天看了下执行计划,
有子查询:288
无子查询:286
可是执行测试还是有子查询的快,还是没弄明白为什么有子查询的快点 :(
jjqxt 2011-05-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 whmd8pdy 的回复:]
你重复1000次 是怎么做的?
[/Quote]
有一堆数据,大概16万条,全放在list里


for(int i=0;i<1000;i++){
Map m = (Map)list.get(i);
//用上面的MAP,构造SQl语句
//执行SQL
}

上面省了JDBC的代码,执行速度检测都是检测executeUpdate()函数的耗时
whmd8pdy 2011-05-24
  • 打赏
  • 举报
回复
你重复1000次 是怎么做的?
tangren 2011-05-23
  • 打赏
  • 举报
回复
一行数据update是不能说明问题的。
如果大量数据,第2条语句更慢是确定的,
原因是:第一个语句只是针对a09表进行一次全扫描,然后更新就行了。
而第二个语句,子查询要进行一次与第一个语句一样的全表扫描,而且还要进行一次索引唯一扫描。
多出读索引块的操作,如果一个唯一索引扫描进行两次I/O,那么,1000次update,将多出2000次
一致读,这样累计消耗资源就比较明显了。
NewJordan99 2011-05-23
  • 打赏
  • 举报
回复
第二条比第一条快?不可能吧,lz是不是搞错了?set autotrace看看
amdgaming 2011-05-23
  • 打赏
  • 举报
回复
看 执行计划

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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