oracle11g的sql文执行时间相关请教

菖蒲老先生 2011-10-21 11:38:48
请教一个困扰我两天的问题。

假如有两个sql文

sql1

select a1,a2,a3,。。。。。。 a44

from a

where id in (1000个) or id in ( 1000个 ) ……..

select中共取得44列数据,where中共10000个id


sql2

select a1,a2,a3,。。。。。。 a44 。。。。。。 a60

from a

where id in (1000个) or id in ( 1000个 ) ……..

select中共取得60列数据,where中共10000个id


这两个sql文的返回结果分别是 44*10000 的方阵
以及 60*10000 的方阵

a表的id字段有主键唯一索引

困惑:

为什么在sqlplus中分析sql1比sql2执行时间短,
而在java中用statement.executeUpdate(sql)执行结果却是
sql2比sql执行时间短呢?

各位有无思路及建议之处。。。
...全文
140 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
菖蒲老先生 2011-10-24
  • 打赏
  • 举报
回复
各位,会不会与索引有关系呢
又或者索引所在的表空间大小由于长时间高频率的查询变的越来越大而导致的呢。
iqlife 2011-10-21
  • 打赏
  • 举报
回复
好像记错了,应该索引大的插入应该是最新插入的,索引高点
iqlife 2011-10-21
  • 打赏
  • 举报
回复
看下执行计划,
索引是什么索引类型?B-TREE?
记得索引值越大效率越低,好像有个这么的论证。。。
cosio 2011-10-21
  • 打赏
  • 举报
回复
可不可以先试一下相同的时间,也是按照同样的顺序来执行?
菖蒲老先生 2011-10-21
  • 打赏
  • 举报
回复
没有。。。

很是奇怪。

比如
1,select 20列 from a where id in (10001 ~ 20000)
2,select 40列 from a where id in (20001 ~ 30000)
3,select 60列 from a where id in (30001 ~ 40000)
4,select 80列 from a where id in (40001 ~ 50000)

sqlplus中执行时间
1<2<3<4

java中执行时间
1<3<2<4

求解!


[Quote=引用 1 楼 cosio 的回复:]
SQL code
如果是sqlplus里面解决那个时间短,JAVA里面有没有并发情况?
[/Quote]
cosio 2011-10-21
  • 打赏
  • 举报
回复
如果是sqlplus里面解决那个时间短,JAVA里面有没有并发情况?
Alessandro_ 2011-10-21
  • 打赏
  • 举报
回复
学习啦。
minitoy 2011-10-21
  • 打赏
  • 举报
回复
一般直接叫sql或者sql语句。
sql文这种叫法貌似在对日外包的招聘中见的比较多-_-!
[Quote=引用 12 楼 flagiris 的回复:]

中国人的说法是???

引用 10 楼 minitoy 的回复:
sql文?
这么别扭的说法是日本人的习惯?
[/Quote]
菖蒲老先生 2011-10-21
  • 打赏
  • 举报
回复
执行计划的时间是正常的,
关键是java里执行时间比较奇怪。。。

[Quote=引用 11 楼 opps_zhou 的回复:]
你把 4 个语句的执行计划弄出来看看
[/Quote]
菖蒲老先生 2011-10-21
  • 打赏
  • 举报
回复
中国人的说法是???

[Quote=引用 10 楼 minitoy 的回复:]
sql文?
这么别扭的说法是日本人的习惯?
[/Quote]
opps_zhou 2011-10-21
  • 打赏
  • 举报
回复
你把 4 个语句的执行计划弄出来看看
minitoy 2011-10-21
  • 打赏
  • 举报
回复
sql文?
这么别扭的说法是日本人的习惯?
菖蒲老先生 2011-10-21
  • 打赏
  • 举报
回复
写错了
java里用得时executeQuery(sql)

义务上不涉及对db的更新,删除操作

只是查询效率问题。。。


[Quote=引用 8 楼 tiangtangcao 的回复:]
引用 2 楼 flagiris 的回复:
1,select 20列 from a where id in (10001 ~ 20000)
2,select 40列 from a where id in (20001 ~ 30000)
3,select 60列 from a where id in (30001 ~ 40000)
4,select 80列 from a where id in……
[/Quote]
tiangtangcao 2011-10-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 flagiris 的回复:]
1,select 20列 from a where id in (10001 ~ 20000)
2,select 40列 from a where id in (20001 ~ 30000)
3,select 60列 from a where id in (30001 ~ 40000)
4,select 80列 from a where id in (40001 ~ 50000)
sqlplus中执行时间
1<2<3<4
java中执行时间
1<3<2<4
[/Quote]

在sqlplus的执行计划里头,在where条件一样时,返回的字段越多,它的执行时间就越长.

由于本人对executeUpdate不是很了解,将该方法贴一下:
java中用statement.executeUpdate(sql)
方法executeUpdate
用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQL DDL(数据定义语言)语句,例如 CREATE TABLE 和 DROP TABLE。INSERT、UPDATE 或 DELETE 语句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一个整数,指示受影响的行数(即更新计数)。对于 CREATE TABLE 或 DROP TABLE 等不操作行的语句,executeUpdate 的返回值总为零。
使用executeUpdate方法是因为在 createTableCoffees 中的 SQL 语句是 DDL (数据定义语言)语句。创建表,改变表,删除表都是 DDL 语句的例子,要用 executeUpdate 方法来执行。你也可以从它的名字里看出,方法 executeUpdate 也被用于执行更新表 SQL 语句。实际上,相对于创建表来说,executeUpdate 用于更新表的时间更多,因为表只需要创建一次,但经常被更新。

~~~关注一下!!
菖蒲老先生 2011-10-21
  • 打赏
  • 举报
回复
我知道这个问题比较奇怪,问题可能比较隐蔽,
很难会得到解决方法。
菖蒲老先生 2011-10-21
  • 打赏
  • 举报
回复
就是普通的主键唯一索引。

[Quote=引用 4 楼 java3344520 的回复:]
看下执行计划,
索引是什么索引类型?B-TREE?
记得索引值越大效率越低,好像有个这么的论证。。。
[/Quote]

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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